vc++ 2017 編寫pb(powerbuilder)可以調用的dll庫程序(含C語言字符串處理函數)

powerbuilder 程序開發過程,經常會調用一些外部函數(dll動態鏈接庫),本文介紹 vc++如何編寫,pb可以調用的dll庫函數。


示例使用IDE:microsoft visual studio 2017

一、創建一個動態鏈接庫(DLL)項目。

在這裏插入圖片描述


二、編寫一個簡單的函數,接收一個intarg1,返回arg1+1的結果。

#include "stdafx.h"

extern "C"
{
	_declspec(dllexport) int funcA(int arg1)
	{
		int res;
		res = arg1 + 1;
		return res;
	}
}

三、def模塊定義文件的創建及綁定

嘗試編譯輸出DLL,並在PB中進行聲明調用。這時會發現,PB無法調用,會產生類似圖中的錯誤。
error:error calling external function XXX ....

在這裏插入圖片描述


這是缺少模塊定義文件。
1、按圖中操作添加一個def文件

在這裏插入圖片描述

2、在應用屬性頁面,確定鏈接器=》輸入=》模塊定義文件 已綁定上面生成的文件。

在這裏插入圖片描述

3、編輯def文件。
文件比較簡單,標識dll文件名,和包含的函數列表就可以了
注意函數名要和程序中定義的相同,且區分大小寫

在這裏插入圖片描述


四、調用約定的設置。

再次嘗試編譯輸出DLL,並在PB中進行聲明調用,結果又產生了類似圖中的另一個錯誤。
error:specified argument type differs from ....

在這裏插入圖片描述


解決這個問題需要設置調用約定
同樣,打開應用的屬性頁面,按圖中操作即可

在這裏插入圖片描述


嘗試編譯輸出,第一個dll 庫函數就完成了

在這裏插入圖片描述


如果函數需要處理字符串,要稍微複雜一些


創建一個字符串處理的函數

一、新增代碼內容

_declspec(dllexport) char* funcB(char* arg1)
	{
		static char res[50];
		strcpy(res,"測試字符串+")		
		strcat(res, arg1 );		
		return res;
	}


二、直接編譯,會有一個錯誤

在這裏插入圖片描述

錯誤大致的原因,是字符串操作函數又內存溢出的風險.
需要添加預處理器定義,按圖中操作添加_CRT_SECURE_NO_WARNINGS

在這裏插入圖片描述


至此,庫函數通常已經可以正常工作,不過複製到其他沒有IDE環境中,可能會提示缺少相關DLL,按圖操作,更改運行庫爲:多線程 /MT .編譯後的DLL文件大小要比原先大一些。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章