extern "C" __declspec(dllexport)

Mr_John_Liang發表於2013-06-07

一、__declspec(dllexport):

        將一個函式聲名為匯出函式,就是說這個函式要被其他程式呼叫,即作為DLL的一個對外函式介面。

       通常它和extern    "C"   合用,形式如下:

extern "C"
{
__declspec(dllexport) RETURN_TYPE FUNCTION()
{
}
}
       這是由於在製作DLL匯出函式時由於C++存在函式過載,因此__declspec(dllexport)    FUNCTION(int,int)    在DLL會被decorate,例如被decorate成為    function_int_int,而且不同的編譯器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址時的不便,使用extern    "C"時,上述的decorate不會發生,因為C沒有函式過載,如此一來被extern"C"修飾的函式,就不具備過載能力。

二、以下內容摘自MSDN:

“在 32 位編譯器版本中,可以使用__declspec(dllexport) 關鍵字從 DLL 匯出資料、函式、類或類成員函式。__declspec(dllexport)將匯出指令新增到物件檔案(即obj檔案),若要匯出函式,__declspec(dllexport)關鍵字必須出現在呼叫約定關鍵字的左邊(如果指定了關鍵字)。例如:

__declspec(dllexport) void __cdecl Function1(void);

若要匯出類中的所有公共資料成員和成員函式,關鍵字必須出現在類名的左邊,如下所示:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

生成 DLL 時,通常建立一個包含正在匯出的函式原型和/或類的標頭檔案,並將__declspec(dllexport)新增到標頭檔案中的宣告。
若要提高程式碼的可讀性,請為__declspec(dllexport)定義一個巨集並對正在匯出的每個符號使用該巨集:
#define DllExport   __declspec( dllexport ) ”

三、__declspec(dllexport) 與 .def

模組定義 (.def) 檔案是包含一個或多個描述各種 DLL 屬性的 Module 語句的文字檔案。
1、二者的目的都是將公共符號匯入到應用程式中或從 DLL 匯出函式。
2、新增 __declspec(dllexport)是為了提供不使用.def檔案從 .EXE 或 .DLL 匯出函式的簡單方法。
3、如果不使用 __declspec (dllimport) 或 __declspec(dllexport) 匯出 DLL 函式,則 DLL 需要.def檔案。
4、並不是任何時候選擇新增 __declspec(dllexport)而放棄.def的方式都是好的。如果DLL是提供給VC++使用者使用的,只需要把編譯DLL時產生的.lib提供給使用者,它可以很輕鬆地呼叫你的DLL。但是如果DLL是供VB、PB、Delphi使用者使用的,那麼會產生一個小麻煩。因為VC++對於__declspec(dllexport) 宣告的函式會進行名稱轉換,如下面的函式: 
     __declspec(dllexport) int __stdcall IsWinNT() 
     會轉換為IsWinNT@0,這樣你在VB中必須這樣宣告: 
     Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long 
     @的後面的數由於引數型別不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。

上一篇:enum列舉型別下一篇:DLL

相關文章