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

VC++ 隱式連結無 .LIB 檔 DLL 的重建導入庫技術

     編輯:VC 教學

背景

第三方 DLL 常無提供 .lib 導入庫,VC++ 隱式連結 (靜態載入) 需 .lib 解析符號。本文詳述從 DLL 重建 .lib 完整流程。

一、DLL 匯出慣例與名稱修飾

慣例參數入堆堆疊清理VC++ 修飾結果
_cdecl (C/C++ 預設)右→左呼叫者前綴 _ : _func
_stdcall (WinAPI)右→左被呼叫者前綴 _ + 後綴 @n : _func@12
_fastcall前兩參數用暫存器被呼叫者前綴 @ + 後綴 @n : @func@12

.def 檔 EXPORTS 區可指定匯出名稱,消除修飾。

二、重建 .lib 步驟

  1. 取得匯出資訊:
    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]  (序數匯出,無名稱)
  2. 建立 .def 檔 (ThirdParty.def):
    LIBRARY "ThirdParty"
    EXPORTS
        cdeclFunc      @1
        _stdcallFunc@8 @2
        @fastcallFunc@8 @3
        NonameFunc     @4   ; 為 NONAME 指定任意名稱
  3. 產生 .lib:
    lib /def:ThirdParty.def /out:ThirdParty.lib
  4. 客戶端專案設定:
    • 標頭檔宣告對應慣例:extern "C" void _stdcall StdcallFunc(int);
    • 連結器 → 輸入 → 附加相依性 加入 ThirdParty.lib。
    • .dll 放入輸出目錄或系統路徑。

三、呼叫 Windows 未文件化函數實例

目標: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 指定名稱並對應序數。
  • 呼叫慣例 **必須與 DLL 實際一致**,否則堆疊損壞崩潰。
  • 若 DLL 為 C++ 類別匯出 (名稱修飾極複雜),此法極難維護,**建議要求廠商提供 .h/.lib** 或改用顯式載入 LoadLibrary/GetProcAddress。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved