DLL 匯出方法(兩種)

2021-07-24 07:23:16 字數 3125 閱讀 5427

使用 def 檔案從 dll 匯出

模組定義 (.def) 檔案是包含乙個或多個描述 dll 各種特性的 module 語句的文字檔案。 

如果不使用 __declspec(dllexport) 關鍵字匯出 dll 的函式,則 dll 需要 .def 檔案。

.def 檔案必須至少包含下列模組定義語句:

例如,包含實現二進位制搜尋樹的**的 dll 看上去可能像下面這樣:

library   btree

exports

insert @1

delete @2

member @3

min @4

如果使用 mfc dll 嚮導建立 mfc dll,則嚮導將為您建立主幹 .def 檔案並將其自動新增到專案中。 

新增要匯出到此檔案的函式名。 

對於非 mfc dll,必須親自建立 .def 檔案並將其新增到專案中。

如果匯出 c++ 檔案中的函式,必須將修飾名放到 .def 檔案中,或者通過使用外部「c」定義具有標準 c 鏈結的匯出函式。 

如果需要將修飾名放到 .def 檔案中,則可以通過使用 dumpbin 工具或 /map 鏈結器選項來獲取修飾名。 

請注意,編譯器產生的修飾名是編譯器特定的。 

如果將 visual c++ 編譯器產生的修飾名放到 .def 檔案中,則鏈結到 dll 的應用程式必須也是用相同版本的 visual c++ 生成的,這樣呼叫應用程式中的修飾名才能與 dll 的 .def 檔案中的匯出名相匹配。

如果生成 擴充套件 dll 並使用 .def 檔案匯出,則將下列**放在包含匯出類的標頭檔案的開頭和結尾:

#undef afx_data

#define afx_data afx_ext_data

// #undef afx_data

#define afx_data

這些**行確保內部使用的 mfc 變數或新增到類的變數是從擴充套件 dll 匯出(或匯入)的。 

例如,當使用 declare_dynamic 派生類時,該巨集擴充套件以將 cruntimeclass 成員變數新增到類。 

省去這四行**可能會導致不能正確編譯或鏈結 dll,或在客戶端應用程式鏈結到 dll 時導致錯誤。

當生成 dll 時,鏈結器使用 .def 檔案建立匯出 (.exp) 檔案和導入庫 (.lib) 檔案。 

然後,鏈結器使用匯出檔案生成 dll 檔案。 

隱式鏈結到 dll 的可執行檔案在生成時鏈結到導入庫。

請注意,mfc 本身使用 .def 檔案從 mfcx0.dll 匯出函式和類。

**:使用 __declspec(dllexport) 從 dll 匯出

microsoft 在 visual c++ 的 16 位編譯器版本中引入了 __export,使編譯器得以自動生成匯出名並將它們放到乙個 .lib 檔案中。 

然後,此 .lib 檔案就可以像靜態 .lib 那樣用於與 dll 鏈結。

在更新的編譯器版本中,可以使用 __declspec(dllexport) 關鍵字從 dll 匯出資料、函式、類或類成員函式。 

__declspec(dllexport) 會將匯出指令新增到物件檔案中,因此您不需要使用 .def 檔案。

當嘗試匯出 c++ 修飾函式名時,這種便利最明顯。 

由於對名稱修飾沒有標準規範,因此匯出函式的名稱在不同的編譯器版本中可能有所變化。 

如果使用 __declspec(dllexport),僅當解決任何命名約定更改時才必須重新編譯 dll 和依賴 .exe 檔案。

許多匯出指令(如序號、noname 和 private)只能在 .def 檔案中建立,並且必須使用 .def 檔案來指定這些特性。 

不過,在 .def 檔案的基礎上另外使用 __declspec(dllexport) 不會導致生成錯誤。

若要匯出函式,__declspec(dllexport) 關鍵字必須出現在呼叫約定關鍵字的左邊(如果指定了關鍵字)。 

例如:

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

class __declspec(dllexport) cexampleexport : public cobject

;

說明__declspec(dllexport) 不能應用於具有 __clrcall 呼叫約定的函式。

生成 dll 時,通常建立乙個包含正在匯出的函式原型和/或類的標頭檔案,並將 __declspec(dllexport) 新增到頭檔案中的宣告中。 

若要提高**的可讀性,請為 __declspec(dllexport) 定義乙個巨集並對正在匯出的每個符號使用該巨集:

#define dllexport   __declspec( dllexport )
__declspec(dllexport) 將函式名儲存在 dll 的匯出表中。 

如果希望優化表的大小,請參見 按序號而不是按名稱從 dll 匯出函式。

說明將 dll 源**從 win16 移植到 win32 時,請用 __declspec(dllexport) 替換 __export 的每個例項。

作為參考,請在 win32 winbase.h 標頭檔案中搜尋。 

它包含 __declspec(dllimport) 的用法示例。

**:模組定義 (.def) 檔案

模組定義 (.def) 檔案為鏈結器提供有關被鏈結程式的匯出、特性及其他方面的資訊。 

生成 dll 時,.def 檔案最有用。 

由於存在可代替模組定義語句使用的 鏈結器選項,通常不需要 .def 檔案。 

也可以將 __declspec(dllexport) 用作指定匯出函式的手段。

在鏈結器階段可以使用 /def(指定模組定義檔案)鏈結器選項呼叫 .def 檔案。

如果生成的 .exe 檔案沒有匯出,使用 .def 檔案將使輸出檔案較大並降低載入速度。

有關示例,請參見 使用 def 檔案從 dll 匯出。

有關更多資訊,請參見下列章節:

**:

VC 中dll的兩種匯出方法

若要確定用於匯出函式的方法 def 檔案或 declspec dllexport 關鍵字 請回答下列問題 在 def 檔案中匯出函式使您得以控制匯出序號。當將附加的匯出函式新增到 dll 時,可以給它們分配更高的序號值 高於任何其他匯出函式 當您進行此操作時,使用隱式鏈結的應用程式不必與包含新函式的...

Dll匯出函式的兩種方式

dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dllexport 另外一種方式是 採用模組定義 def 檔案宣告,def 檔案為鏈結器提供了有關被鏈結程式的匯出 屬性及其他方面的資訊。方式一 在函式宣告中加上 declspec dllexport 在動態鏈結庫程式...

DLL中匯出函式的兩種方式

dll中匯出函式的兩種方式 dllexport與.def檔案 2009 03 06 11 34 58 標籤 dll匯出函式 兩種方式 declspec dllexport def 檔案it 分類 程式設計技術 dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dlle...