DLL中匯出函式的宣告有兩種方式

2021-06-28 02:42:44 字數 1888 閱讀 7756

本文引用自: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...