首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VC++ DLL 導出函數參數在 OD 中消失:缺少 .def 檔案導致名稱修飾

     編輯:程式設計疑難解答

現象

VC++ 編譯 DLL,OD 反組譯顯示導出函數 A+B 參數消失,呼叫時彈出錯誤。

根本原因

  1. C++ 名稱修飾:編譯器對函數名進行修飾(包含參數型別、呼叫慣例),導致導出符號難以識別。
  2. 未使用 .def 檔案或 extern "C":直接 __declspec(dllexport) 導出 C++ 函數,呼叫端需完全相同的編譯器版本、呼叫慣例、結構對齊才能正確連結。

解決方案

方法一:使用 .def 模組定義檔(推薦)

; MyDll.def
LIBRARY "MyDll"
EXPORTS
    AddNumbers @1   ; 導出名稱固定為 AddNumbers,無修飾

專案屬性 → Linker → Input → Module Definition File → MyDll.def。

方法二:extern "C" + __stdcall

// MyDll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

extern "C" MYDLL_API int __stdcall AddNumbers(int a, int b);
  • extern "C" 禁用 C++ 名稱修飾。
  • __stdcall 統一呼叫慣例(Windows API 標準)。

驗證工具:dumpbin

dumpbin /exports MyDll.dll

輸出應顯示清晰的 AddNumbers 而非修飾後的 ?AddNumbers@@YGHHH@Z。

最佳實踐

  1. 對外介面統一使用 C 風格介面 (extern "C"),內部實作可用 C++。
  2. 提供 .h、.lib、.dll 三件套給呼叫端。
  3. 版本升級時維持導出函數簽名不變,新增功能新增函數,避免二進位不相容。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved