EXPORTS

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

EXPORTS
   definition

備註

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

匯出 定義的 語法為:

entryname [ = internal_name other_module.exported | _name ] [ordinal [ @ NONAME ] ] [ [ PRI加值稅E ] |[ 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 ,您必須知道序數,因為名稱無效。

選擇性關鍵字 PRI加值稅E 可防止 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)

另請參閱

模組定義陳述式的規則