VC中無LIB時的DLL隱式連結,製作與VC++相符合的LIB函式符號輸入庫 (轉)

worldblog發表於2007-12-15
VC中無LIB時的DLL隱式連結,製作與VC++相符合的LIB函式符號輸入庫 (轉)[@more@]

請大家注意!這種方法只能應用於輸出為C格式的__stdcall方式!

1. 使用VC++的工具DUMPBIN將DLL中的匯出表匯出到一定義(.DEF)
 EXAMPLE:
 DUMPBIN VoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
 
2. 將匯出的.DEF檔案整理為一符合.DEF個數的函式匯出檔案
 EXAMPLE:
 VideoDeCoder.DEF 檔案內容如下
 
  Dump of file VideoDeCoder.dll 
 
  File Type: DLL 
 
  Section contains the following exports for VideoDeCoder.dll 
 
  0 characteristics 
  3D49E48F time date stamp Fri Aug 02 09:46:55 2002 
  0.00 version 
  1 ordinal base 
  11 number of functions 
  11 number of names 
 
  ordinal hint RVA  name 
 
  1  0 00010F60 to:_TM_ClearDecoderBuff@4">_TM_ClearDecoderBuff@4 
  2  1 00010E80  
  3  2 00010F00  
  4  3 00010ED0  
  5  4 00010FD0  
  6  5 00011030  
  7  6 00011060  
  8  7 00011000  
  9  8 00010E10  
  10  9 00010F30  
  11  A 00010F90  
 
  Summary 
 
  2000 .data 
  1000 .rdata 
  1000 .reloc 
  15000 .text 
 按照以下方法整理:
 1>新增LIB說明
 LIBRARY "VideoDeCoder"  ;"xx"為DLL名稱
  DESCRIPTION "VideoDeCoder library" 
  2>去掉匯出函式說明端以外的內容,在LIB說明下新增 "EXPROTS" 說明匯出函式
   LIBRARY "VideoDeCoder"
 DESCRIPTION "VideoDeCoder library"

 EXPORTS
  ordinal hint RVA  name   
 
  1  0 00010F60  
  2  1 00010E80  
  3  2 00010F00 _TM_DecodePicture@ 
  4  3 00010ED0 _TM_DecodePictureH 
  5  4 00010FD0  
  6  5 00011030  
  7  6 00011060  
  8  7 00011000  
  9  8 00010E10  
  10  9 00010F30  
  11  A 00010F90  
  3>將所有的函式放至行首,去掉 "hint" 和 "RVA" 資料,留下函式的序號 "ordinal" ,在序號前加上 "@" 符號
  形成 "_匯出函式名@引數位元組和 @序號" 此種格式(__stdcall 方式呼叫匯出的函式符號是 "函式名稱@引數位元組和").
  最後形成.DEF檔案如下:
  LIBRARY "VideoDeCoder"
 DESCRIPTION "VideoDeCoder library"

 EXPORTS
 
   @1 
   @2 
   @3 
   @4 
   @5 
   @6 
   @7 
   @8 
   @9 
   @10 
   @11 
3. 使用VC++的LIB工具,帶/DEF:(.def檔名) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB檔案了.
 EXAMPLE:
 LIB /DEF:VideoDeCoder.def /MACHINE:IX86

4. 接時帶上LIB檔案連結;注意的是當有些動態庫DUMPBIN的只有函式名,無"@nn"的引數格式,如C++Builder寫的DLL,輸出就只有函式名符號,連結時就會報錯:
 error LNK2002:unresolved external symbol ""
提示中引入的函式符號無法識別,這時只要將DEF檔案中相應的函式名稱改為方式,重新建立
LIB,重新連結即可.

這樣就製作成功了符合VC呼叫方式的LIB了!

參考:MSDN2000

要值得一說的是!BORLAND C++BUILDER有一個很好的工具IMPDEF可以直接將DLL中的函式輸出到.DEF檔案中,只要做一點點修改就可以成為符合VC的DEF檔案!

IMPDEF xxx.def xxx.dll

這種方法只能應用於輸出為C格式的__stdcall呼叫方式經過我的論證有些錯誤!我利用Borland C++和VC++做論證,發現:

而在C++BUILDER中!
__cdecl的函式輸出前會帶一"_"
__stdcall無特徵,只輸出函式名
__fastcall函式輸出前帶一"@"
都無"@nn"字尾格式!
在VC中!
__cdecl無特徵,只輸出函式名
__stdcall的函式輸出前會帶一"
__fastcall函式輸出前帶一"@"字尾帶"@nn

只要將BC的DEF檔案中函式申明格式轉換為VC識別的格式就可以利用LIB工具生成LIB;要使用C分格輸出(extern "C")才是必須的!而且別忘了在DEF檔案中的函式申明不要帶“_”啊!:)不然會出現error LNK2001的連結錯誤!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993803/,如需轉載,請註明出處,否則將追究法律責任。

相關文章