本文引用自:vc程式設計時dll中匯出函式的宣告有兩種方式
一種方式是:在函式宣告中加上__declspec(dllexport);
方式一:在函式宣告中加上__declspec(dllexport)
/// 在動態鏈結庫程式中
/// 宣告動態鏈結庫(**.dll)的對外介面函式testfuction
extern "c" __declspec(dllexport) int testfuction(int ntype,char *strpath,std::vector&vecdata)
/// 在外部希望呼叫動態鏈結庫的程式中
/// 載入動態鏈結庫(**.dll)並呼叫其對外介面testfuction
void func()
//定義乙個與函式testfuction型別相同的函式指標lpproc
testdll lpproc;
//搜尋**.dll中函式名為testfuction的對外介面
lpproc = (testdll)getprocaddress (hmod,"testfuction");
//如果搜尋成功
if(null != lpproc)
//...
//在恰當的時候釋放動態鏈結庫**.dll
freelibrary(hmod);
}方式二:採用模組定義(.def)檔案宣告
首先建立 乙個dll程式(dlltestdef)
在*.cpp中
int __stdcall add(int numa, int numb)
int __stdcall sub(int numa, int numb)
然後建立乙個.def的檔案,在裡面加上
;dlltestdef.lib : 匯出dll函式
library dlltestdef
exports
add @ 1
sub @ 2
最後建立乙個測試程式:.cpp檔案如下:
#include
#include
using namespace std;
typedef int (__stdcall *fun)(int, int);
hinstance hinstance;
fun fun;
int main()
cout << fun(1, 2) << endl;
freelibrary(hinstance);
return 0;
}說明:
.def檔案的規則為:
(1)library語句說明.def檔案相應的dll;
(2)exports語句後列出要匯出函式的名稱。可以在.def檔案中的匯出函式名後加@n,表示要匯出函式的序號為n(在進行函式呼叫時,這個序號將發揮其作用);
(3).def 檔案中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一行。
(4)使用__declspec(dllexport)和使用.def檔案是有區別的。
如果你的dll是提供給vc使用者使用的,你只需要把編譯dll時產生的.lib提供給使用者,
它可以很輕鬆地呼叫你的dll。但是如果你的dll是供vb、pb、delphi使用者使用的,那麼會產生乙個小麻煩。
因為vc++編譯器對於__declspec(dllexport)宣告的函式會進行名稱轉換,如下面的函式:
__declspec(dllexport) int __stdcall add()
會轉換為add@0,這樣你在vb中必須這樣宣告:
declare function add lib "dlltestdef.dll" alias "add@0" () as long
@後面的數由於引數型別不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式匯出函式了。
DLL中匯出函式宣告的兩種方式
1.在函式宣告器那面加上 declspec dllexport 2.另種方式是採用模組定義檔案 def def檔案為聯結器提供了有關被連線程式的匯出,屬性以及其他資訊 def檔案的規則 1 library語句說明.def檔案相應的dll 2 exports語句後列出要匯出函式的名稱。可以在.def檔...
DLL中匯出函式的兩種方式
dll中匯出函式的兩種方式 dllexport與.def檔案 2009 03 06 11 34 58 標籤 dll匯出函式 兩種方式 declspec dllexport def 檔案it 分類 程式設計技術 dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dlle...
DLL中匯出函式的兩種方式
經常使用vc6的dependency檢視dll匯出函式的名字,會發現有dll匯出函式的名字有時大不相同,導致不同的原因大多是和編譯dll時候指定dll匯出函式的界定符有關係。vc 支援兩種語言 即c c 這也是造成dll匯出函式差異的根源 我們用vs2008新建個dll工程,工程名為 testdll...