語法:
EXPORTS
EntryName[=InternalName] [@Ordinal[NONAME]] [DATA] [PRIVATE]
EntryName:外部可見名稱(C++ 需填寫修飾名)。@Ordinal:導出序號(1~65535),按序號導出可節省導出表空間,調用略快。NONAME:僅按序號導出,不存名稱字符串。DATA:導出變量而非函數。獲取 C++ 修飾名:編啟用 /MAP 生成 .map 文件,或 DUMPBIN /SYMBOLS。
/EXPORTlink /EXPORT:FuncName=InternalName,@Ordinal,DATA。適合構建腳本自動化,不常用於手工開發。
__declspec(dllexport) —— 推薦方式MFC 提供宏自動切換導出/導入:
優先級建議:
__declspec(dllexport)> .DEF >/EXPORT。.DEF 按序號導出效率略高,適合大量導出的系統級 DLL。模塊定義文件(.DEF)結構
至少包含:
LIBRARY DLLName(必須為首行,指定 DLL 文件名)。EXPORTS區塊列出導出符號。- 可選:
DESCRIPTION "..."、SECTIONS、STACKSIZE等。- 註釋以分號
;開頭。DLL 與調用進程/線程的關係
HMODULE)可在進程間傳遞;進程句柄可被 DLL 使用。默認情況下,DLL 全局變量每進程一份實例。實現跨進程共享數據:
#pragma data_seg("Shared") int g_Counter = 0; #pragma data_seg()/SECTION:Shared,RWS(讀寫共享)。多線程訪問共享變量需同步機制(互斥量、臨界區)。線程私有數據請使用 TLS (TlsAlloc/__declspec(thread))。