第三方 DLL 常無提供 .lib 導入庫,VC++ 隱式連結 (靜態載入) 需 .lib 解析符號。本文詳述從 DLL 重建 .lib 完整流程。
| 慣例 | 參數入堆 | 堆疊清理 | VC++ 修飾結果 |
|---|---|---|---|
_cdecl (C/C++ 預設) | 右→左 | 呼叫者 | 前綴 _ : _func |
_stdcall (WinAPI) | 右→左 | 被呼叫者 | 前綴 _ + 後綴 @n : _func@12 |
_fastcall | 前兩參數用暫存器 | 被呼叫者 | 前綴 @ + 後綴 @n : @func@12 |
.def 檔 EXPORTS 區可指定匯出名稱,消除修飾。
dumpbin /exports ThirdParty.dll > exports.txt
輸出範例:
ordinal hint RVA name
1 0 00001000 _cdeclFunc
2 1 0000100A _stdcallFunc@8
3 2 00001014 @fastcallFunc@8
4 0000101E [NONAME] (序數匯出,無名稱)
ThirdParty.def):
LIBRARY "ThirdParty"
EXPORTS
cdeclFunc @1
_stdcallFunc@8 @2
@fastcallFunc@8 @3
NonameFunc @4 ; 為 NONAME 指定任意名稱
lib /def:ThirdParty.def /out:ThirdParty.lib
extern "C" void _stdcall StdcallFunc(int);ThirdParty.lib。.dll 放入輸出目錄或系統路徑。目標:Shell32.dll 序數 60 的 SHShutDownDialog (顯示關機對話框)。
; Shell32.def
LIBRARY "Shell32"
EXPORTS
SHShutDownDialog@4 @60 ; _stdcall, 1 參數 (4 bytes)
// Caller.cpp
extern "C" long _stdcall SHShutDownDialog(long lShutdown);
#pragma comment(lib, "Shell32.lib") // 重建後的 lib
int main() { SHShutDownDialog(0); return 0; }
dumpbin 輸出 name 欄若為 [NONAME],必須在 .def 指定名稱並對應序數。LoadLibrary/GetProcAddress。