VC PB dll
和編寫一般的DLL方法相同,需要注意以下兩點:
(1)調用約定
C函數有_stdcall、_cdecl、_fastcall等多種調用約定,調用約定用來說明函數參數的壓棧順序和由誰(函數自身還是調用者)來修改堆棧。關於調用約定的詳細說明,請參考我轉載的另一篇文章。
編寫供PB調用DLL,請使用_stdcall調用約定,如下所示:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name)
{
...
}
(2)def文件
在VC++中,如果生成DLL可以不使用.def文件,只需要在VC++的函數定義前加__declspec(dllexport)修飾就可以了。生成的DLL VC++用戶可以直接使用,但PB、VB等用戶使用會遇到函數名轉換的問題。因為VC++對於__declspec(dllexport)聲明的函數會進行名稱轉換,如下面的函數:
__declspec(dllexport) int _stdcall GetStr()
編譯後會轉換為 GetStr@0,這樣在PB、VB中聲明函數時應該聲明GetStr@0,如果函數帶有參數,轉換後的函數名將更加復雜,這使PB、VB用戶使用起來很不方便。在def文件中由EXPORT輸出函數可解決這個問題。
如dll要輸出如下兩個函數:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name);
extern "C" _declspec(dllexport) char* _stdcall GetStr(int id);
則def文件書寫如下(TEST為工程名):
LIBRARY "TEST"
DESCRIPTION 'TEST Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
GetInt @1
GetStr @2
編譯生成DLL後,在PB中要調用GetStr函數,只需做如下聲明即可:
function string GetStr(int a) library("TEST.dll");
注意,如果您建的是Win32 Dynamic-Link Library 工程,def文件需要自己創建,然後把它加入工程,def文件名需和工程名相同。如您的工程名為test,則創建test.def。