powerbuilder 程序開發過程,經常會調用一些外部函數(dll動態鏈接庫),本文介紹 vc++如何編寫,pb可以調用的dll庫函數。
示例使用IDE:microsoft visual studio 2017
一、創建一個動態鏈接庫(DLL)項目。
二、編寫一個簡單的函數,接收一個int
值 arg1
,返回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文件大小要比原先大一些。