dll匯入和匯出

2021-06-15 22:26:19 字數 3012 閱讀 5649

visual c++

從 dll 匯出

.dll 檔案的布局與 .exe 檔案非常相似,但有乙個重要的差異:dll 檔案包含匯出表。匯出表包含 dll 匯出到其他可執行檔案的每個函式的名稱。這些函式是 dll 中的入口點;只有匯出表中的函式可由其他可執行檔案訪問。dll 中的任何其他函式都是 dll 私有的。通過使用帶 /exports 選項的

dumpbin

工具,可以檢視 dll 的匯出表。

有兩種從 dll 匯出函式的方法:

用上述任何方法匯出函式時,確保使用

__stdcall

呼叫約定。

使用 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

;

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

#define dllexport   __declspec( dllexport )
__declspec(dllexport)將函式名儲存在 dll 的匯出表中。如果希望優化表的大小,請參見按序號而不是按名稱從 dll 匯出函式。

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

DLL匯出類和匯出函式

1 動態庫dll中的類或者函式有時候要被其他的庫呼叫,因此需要被其他庫呼叫的類或者函式需要進行匯出。2 首先編寫需要匯出的dll,新建乙個工程設定應用程式型別為dll 3 類的 如下 標頭檔案 pragma once define ex port declspec dllexport using n...

DLL庫的編寫(匯出 匯入)與使用

dll庫的編寫 匯出 匯入 與使用 1 編寫dll時,為什麼用extern c 因為c和c 的重新命名規則是不一樣的。這種重新命名稱為 name mangling 據說,c 標準並沒有規定name mangling的方案,所以不同編譯器使用的是不同的,例如 borland c 跟microsoft ...

SVN匯入和匯出

匯入專案 在服務端 的repositories 目錄下建立乙個text svnadmin load e repositories text2.0 e text.dmp c program files visualsvn server bin svnadmin dump e repositories ...