共用方式為


EXPORTS

引入一個或多個匯出定義的區段,以指定函式或資料的已匯出名稱或序數。 每一個定義都必須在不同的行上。

EXPORTS
   definition

備註

第一個 定義 可以位於 EXPORTS 與 關鍵詞相同的行上,或位於後續這一行。 .DEF 檔可以包含一個或多個 EXPORTS 陳述式。

匯出 定義的 語法為:

entryname[=internal_name other_module.exported|_name] [ordinal [@NONAME] ] [ [PRIVATE] |[DATA] ]

entryname 是您想要導出的函式或變數名稱。 此為必要項目。 如果您匯出的名稱與 DLL 中的名稱不同,請使用 internal_name 在 DLL 中指定匯出的名稱。 例如,如果您的 DLL 匯出函式 func1,且您想要呼叫端使用它作為 func2,則您可以指定:

EXPORTS
   func2=func1

如果您匯出的名稱來自其他模組,請使用 other_module.exported_name 在 DLL 中指定導出的名稱。 例如,如果您的 DLL 匯出函式 other_module.func1,且您想要呼叫端使用它作為 func2,則您可以指定:

EXPORTS
   func2=other_module.func1

如果您匯出的名稱來自另一個依序數導出的模組,請使用 other_module 在 DLL 中指定匯出的序數。#序數。 例如,如果您的 DLL 會從序數 42 的其他模組匯出函式,而且您希望呼叫端使用函式做為 func2,您可以指定:

EXPORTS
   func2=other_module.#42

因為 MSVC 編譯程式針對C++函式使用名稱裝飾,因此您必須在原始程式碼中使用裝飾名稱 internal_name 或定義導出的函 extern "C" 式。 編譯程式也會裝飾 C 函式,這些函式會使用 __stdcall 呼叫慣例搭配底線 (_) 前置詞,後面接著自變數清單中的位元組數(以十進位為單位)所組成的後綴。

若要尋找編譯程式所產生的裝飾名稱,請使用 DUMPBIN 工具或連結器 /MAP 選項。 裝飾名稱是編譯器專屬的。 如果您匯出 .DEF 檔案中的裝飾名稱,則連結至 DLl 的可執行檔必須也使用相同版本的編譯器進行建置。 這可確保呼叫端的裝飾名稱符合 .DEF 檔案中的已匯出名稱。

您可以使用 @ordinal 來指定數位,而不是函數名稱,會進入 DLL 的匯出數據表。 許多 Windows DLL 會匯出序數,以支援舊版程式碼。 通常在 16 位元 Windows 程式碼中使用序數,因為它有助於最大程度減小 DLL 的大小。 除非 DLL 的用戶端需要舊版支援,否則不建議依序數匯出函式。 由於 .LIB 檔會包含序數與函式之間的對應,因此您可以像在使用 DLL 的專案中那樣,使用函式名稱。

藉由使用選擇性 的NONAME 關鍵詞,您只能藉由序數匯出,並減少結果 DLL 中匯出數據表的大小。 不過,如果您想要在 DLL 上使用 GetProcAddress ,您必須知道序數,因為名稱無效。

選擇性關鍵詞 PRIVATE 可防止 entryname 包含在 LINK 所產生的匯入連結庫中。 她不會影響也由 LINK 產生之映像檔中的匯出。

選擇性關鍵詞 DATA 指定匯出是數據,而不是程式代碼。 此範例顯示您可以如何匯出名為 exported_global 的資料變數:

EXPORTS
   exported_global DATA

有四種方法匯出定義,按建議順序列出:

  1. 原始程式碼中的 __declspec(dllexport) 關鍵詞

  2. .DEF 檔中的 EXPORTS 陳述式

  3. LINK 命令中的 /EXPORT 規格

  4. 原始碼中的批註指示詞,格式#pragma comment(linker, "/export: definition ")為 。 下列範例顯示函式宣告之前 #pragma 批註指示詞,其中 PlainFuncName 是未編碼的名稱,而且 _PlainFuncName@4 是函式的裝飾名稱:

    #pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
    BOOL CALLBACK PlainFuncName( Things * lpParams)
    

如果您需要匯出未編碼的函式名稱,並根據組建組態而有不同的匯出,#pragma 指示詞很有用(例如,在32位或64位組建中)。

所有四種方法可在同一程式中使用。 當 LINK 繫結的程式包含匯出時,它還會建立匯入程式庫,除非組建中使用 .EXP 檔。

EXPORTS 區段的範例如下:

EXPORTS
   DllCanUnloadNow      @1          PRIVATE
   DllWindowName = WindowName       DATA
   DllGetClassObject    @4 NONAME   PRIVATE
   DllRegisterServer    @7
   DllUnregisterServer

當您使用 .DEF 檔從 DLL 匯出變數時,您無需在變數上指定 __declspec(dllexport)。 不過,在使用 DLL 的任何檔案中,您必須在資料的宣告上,仍使用 __declspec(dllimport)

另請參閱

模組定義陳述式的規則