引入了一個由一個或多個 definitions(導出的函數或數據)組成的節。每個定義必須在單獨一行上。
EXPORTS definitions
備注
EXPORTS 關鍵字可以在第一個定義所在的同一行或前一行上。.def 文件可以包含一個或多個 EXPORTS 語句。
導出 definitions 的語法為:
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
entryname 是要導出的函數名或變量名。這是必選項。如果導出的名稱與 DLL 中的名稱不同,則通過 internalname 指定 DLL 中導出的名稱。例如,如果 DLL 導出函數 func1(),要將它用作 func2(),則應指定:
EXPORTS func2=func1
@ordinal 允許指定是序號而不是函數名將進入 DLL 的導出表。這有助於最小化 DLL 的大小。.LIB 文件將包含序號與函數之間的映射,這使您得以像通常在使用 DLL 的項目中那樣使用函數名。
可選的 NONAME 關鍵字允許只按序號導出,並減小結果 DLL 中導出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,則必須知道序號,因為名稱將無效。
可選的 PRIVATE 關鍵字禁止將 entryname 放到由 LINK 生成的導入庫中。它對同樣是由 LINK 生成的圖像中的導出無效。
可選的 DATA 關鍵字指定導出的是數據,而不是代碼。例如,可以導出數據變量,如下所示:
EXPORTS i DATA
當對同一導出使用 PRIVATE 和 DATA 時,PRIVATE 必須位於 DATA 的前面。
有三種導出定義的方法,按照建議的使用順序依次為:
所有這三種方法可以用在同一個程序中。LINK 在生成包含導出的程序時還創建導入庫,除非生成中使用了 .exp 文件。
以下是 EXPORTS 節的示例:
EXPORTS DllCanUnloadNow @1 PRIVATE DATA DllWindowName = Name DATA DllGetClassObject @4 NONAME PRIVATE DllRegisterServer @7 DllUnregisterServer
注意,使用 .def 文件從 DLL 中導出變量時,不需要在變量上指定 __declspec(dllexport)。但是,在任何使用 DLL 的文件中,仍必須在數據聲明上使用 __declspec(dllimport)。