使用 .DEF 檔從 DLL 匯出
模組定義或 DEF 檔案 (*.def) 是一個文字檔,其中包含一或多個模組語句,描述 DLL 的各種屬性。 如果您未使用 __declspec(dllexport)
關鍵詞導出 DLL 的函式,DLL 需要 DEF 檔案。
最小 DEF 檔案必須包含下列模組定義語句:
檔案中的第一個語句必須是 LIBRARY 語句。 此語句會將 DEF 檔案識別為屬於 DLL。 LIBRARY 語句後面接著 DLL 的名稱。 鏈接器會將這個名稱放在 DLL 的匯入連結庫中。
EXPORT 語句會列出 DLL 所匯出之函式的名稱,並選擇性地列出序數值。 您可以依照函式的名稱加上符號 (@) 和數位來指派序數值。 當您指定序數值時,它們必須介於範圍 1 到 N 中,其中 N 是 DLL 導出的函式數目。 如果您想要依序數匯出函式,請參閱 依序數從 DLL 匯出函式,而不是依名稱 匯出函式,以及本主題。
例如,包含實作二進位搜尋樹狀結構之程式代碼的 DLL 可能如下所示:
LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4
如果您使用 MFC DLL 精靈 來建立 MFC DLL,精靈會為您建立基本架構 DEF 檔案,並自動將它新增至您的專案。 新增要匯出至此檔案的函式名稱。 針對非 MFC DLL,請自行建立 DEF 檔案,並將它新增至您的專案。 然後移至 [項目>屬性>] 鏈接器>輸入>模組定義檔,然後輸入 DEF 檔案的名稱。 針對每個組態和平臺重複此步驟,或選取 [組態 = 所有組態] 和 [平臺 = 所有平臺] 來一次執行此步驟。
如果您要在C++檔案中匯出函式,您必須將裝飾名稱放在DEF檔案中,或使用extern “C” 來定義導出的函式與標準 C 連結。 如果您需要將裝飾名稱放在 DEF 檔案中,您可以使用 DUMPBIN 工具或使用連結器 /MAP 選項來取得它們。 請注意,編譯程式所產生的裝飾名稱是編譯程式特定的。 如果您將Microsoft C++編譯程式 (MSVC) 所產生的裝飾名稱放入 DEF 檔案中,則連結至 DLL 的應用程式也必須使用相同的 MSVC 版本來建置,讓呼叫應用程式中的裝飾名稱符合 DLL DEF 檔案中導出的名稱。
注意
使用 Visual Studio 2015 建置的 DLL 可由使用 Visual Studio 2017 或 Visual Studio 2019 建置的應用程式取用。
如果您要建置 擴充 DLL 並使用 DEF 檔案進行匯出,請將下列程式代碼放在包含匯出類別的頭檔開頭和結尾:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
這幾行可確保在內部使用或新增至類別的 MFC 變數會從 MFC 擴充功能 DLL 匯出(或匯入)。 例如,使用 DECLARE_DYNAMIC
衍生類別時,巨集會展開以將成員變數新增 CRuntimeClass
至類別。 排除這四行可能會導致 DLL 編譯或連結不正確,或在用戶端應用程式連結至 DLL 時造成錯誤。
建置 DLL 時,鏈接器會使用 DEF 檔案來建立匯出 (.exp) 檔案和匯入連結庫 (.lib) 檔案。 鏈接器接著會使用導出檔案來建置 DLL 檔案。 建置時隱含連結至匯入連結庫之 DLL 連結的可執行檔。
請注意,MFC 本身會使用 DEF 檔案,從MFCx0.dll匯出函式和類別。