天天看點

兩種方式實作DLL導出函數之dllexport與def檔案導出

背景

我們開發DLL的時候,大部分都會導出函數。對于導出函數,常用的有兩種方式,一種是使用 dllexport 關鍵字導出,另一種是使用 .def 檔案導出。我個人比較喜歡用後一種方式導出函數,因為用起來比較省心、友善。

現在,我就把這部分知識整理成文檔,分享給大家。

實作過程

dllexport關鍵字方法

這種方法就是在函數聲明中加上 __declspec(dllexport) 關鍵字,同時也要加上 extern “C” 這個字首,加上extern “C”後,會訓示編譯器這部分代碼按C語言的進行編譯,而不是C++的。

那麼, __declspec(dllexport) 關鍵字導出函數的代碼如下所示:

// 方法一 dllexport

extern “C” __declspec(dllexport) BOOL MyExportFunc_dllexport(char *pszText, char *pszCaption)

{

::MessageBox(NULL, pszText, pszCaption, MB_OK);

return TRUE;

}

def檔案方法

def檔案方法相對于上面介紹的 __declspec(dllexport) 要更簡便,而且很容易了解使用。

一般我們建立的DLL工程是沒有 .def 這個檔案的,需要我們建立并添加到項目工程中,添加方式如下:

選中工程項目,右擊選擇“添加”,并選中“建立項”,在建立項中選擇“Visual C++”下的“代碼”中的“子產品定義檔案(.def)”檔案,并輸入檔案名稱,點選“添加”按鈕,即可成功添加。

添加成功後,我們在建立的 .def 子產品定義檔案中添加 “EXPORTS” 關鍵字段,這個表示DLL的導出函數位置。然後在 “EXPORTS” 字段下面添加要導出函數的名稱即可。如下圖,導出 “MyExportFunc_def” 這個函數。注意,隻需寫檔案名即可。

這樣,對于要導出的函數,我們按正常編寫的方式編寫即可,不需要額外添加任何關鍵字,隻需要把要導出的函數的函數名稱放在“EXPORTS”字段下面就可以成功導出函數。

// 方法一 def檔案

BOOL MyExportFunc_def(char *pszText, char *pszCaption)

{

::MessageBox(NULL, pszText, pszCaption, MB_OK);

return TRUE;

}

程式測試

我們對上面的DLL工程項目進行編譯連結,生成DLL檔案。然後使用,“DEPENDS.EXE”工具檢視新生成的DLL檔案的導出函數。我們可以看到上述分别使用兩種導出函數方法導出的導出函數均成功導出。

總結

對于上面兩種導出方法來說,個人推薦 .def 子產品定義檔案 導出方式,要注意的是,要記得自己手動添加這個檔案,并在檔案中添加“EXPORTS”導出字段。