首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

DLL 全面剖析(四):導出函數、模塊定義文件與進程關係

     編輯:VC 教學

導出函數的三種方法

1. 模塊定義文件(.DEF)—— 傳統且強大

語法:

EXPORTS
    EntryName[=InternalName] [@Ordinal[NONAME]] [DATA] [PRIVATE]
  • EntryName:外部可見名稱(C++ 需填寫修飾名)。
  • @Ordinal:導出序號(1~65535),按序號導出可節省導出表空間,調用略快。
  • NONAME:僅按序號導出,不存名稱字符串。
  • DATA:導出變量而非函數。

獲取 C++ 修飾名:編啟用 /MAP 生成 .map 文件,或 DUMPBIN /SYMBOLS。

2. 鏈接器命令行 /EXPORT

link /EXPORT:FuncName=InternalName,@Ordinal,DATA。適合構建腳本自動化,不常用於手工開發。

3. __declspec(dllexport) —— 推薦方式

MFC 提供宏自動切換導出/導入:

優先級建議:__declspec(dllexport) > .DEF > /EXPORT。.DEF 按序號導出效率略高,適合大量導出的系統級 DLL。

模塊定義文件(.DEF)結構

至少包含:

  1. LIBRARY DLLName(必須為首行,指定 DLL 文件名)。
  2. EXPORTS 區塊列出導出符號。
  3. 可選:DESCRIPTION "..."、SECTIONS、STACKSIZE 等。
  4. 註釋以分號 ; 開頭。

DLL 與調用進程/線程的關係

  • DLL 映射到調用進程的虛擬地址空間(每進程一份映射)。
  • DLL 使用的內存從進程空間分配,僅該進程線程可訪問。
  • DLL 句柄(HMODULE)可在進程間傳遞;進程句柄可被 DLL 使用。
  • DLL 共享調用進程的棧。

共享數據段

默認情況下,DLL 全局變量每進程一份實例。實現跨進程共享數據:

  1. 定義命名數據段:#pragma data_seg("Shared") int g_Counter = 0; #pragma data_seg()
  2. 鏈接器設置屬性:/SECTION:Shared,RWS(讀寫共享)。
  3. 必須初始化,否則變量進入 .bss 段,無法共享。

多線程訪問共享變量需同步機制(互斥量、臨界區)。線程私有數據請使用 TLS (TlsAlloc/__declspec(thread))。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved