EXPORTS
更新:2007 年 11 月
加入為匯出函式或資料的一個或多個 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 之前。
以下是三種匯出定義的方法,以建議使用的順序列出:
原始程式碼中的 __declspec(dllexport) 關鍵字
.def 檔中的 EXPORTS 陳述式
LINK 命令中的 /EXPORT 規格
您可在同一個程式中使用這全部三種方法。當 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)。