本文介紹了在VC中針對無LIB時的DLL隱式連結,製作可供VC++使用的LIB引入庫。
具體步驟如下:
一、使用VC++的工具DUMPBIN將DLL中的匯出函數表匯出到一定義(.DEF)檔案
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
二、將匯出的.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 _TM_ClearDecoderBuff@4
2 1 00010E80 _TM_CloseDecoder@4
3 2 00010F00 _TM_DecodePicture@4
4 3 00010ED0 _TM_DecodePictureHeader@4
5 4 00010FD0 _TM_GetFileEnd@4
6 5 00011030 _TM_GetUValue@4
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 _TM_ClearDecoderBuff@4
2 1 00010E80 _TM_CloseDecoder@4
3 2 00010F00 _TM_DecodePicture@
4 3 00010ED0 _TM_DecodePictureH
5 4 00010FD0 _TM_GetFileEnd@4
6 5 00011030 _TM_GetUValue@4
3)將所有的函數放至第一列,去掉“hint”和“RVA”列資料,留下函數的序號"ordinal",在序號前加上"@ "符號形成“_匯出函數名@參數位元組和 @序號”此種格式(__stdcall 方式調用匯出的函數符號是 "函數名稱@參數位元組和 ").
最後形成.DEF檔案如下(其餘部分全部刪除,推薦用UltraEdit列模式進行編輯):
LIBRARY "VideoDeCoder "
DESCRIPTION "VideoDeCoder library "
EXPORTS
TM_ClearDecoderBuff@4 @1
TM_CloseDecoder@4 @2
TM_DecodePicture@4 @3
TM_DecodePictureHeader@4 @4
TM_GetFileEnd@4 @5
TM_GetUValue@4 @6
TM_GetVValue@4 @7
TM_GetYValue@4 @8
TM_OpenDecoder@8 @9
TM_ReturnType@4 @10
TM_SetFileEnd@8 @11
三、使用VC++的LIB工具,帶/DEF:(.def檔案名稱) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB檔案了.
EXAMPLE:
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
四、接時帶上LIB檔案連結;注意的是當有些動態庫DUMPBIN的只有函數名,無 "@nn "的參數格式,如C++Builder寫的DLL,輸出就只有函數名符號,連結時就會報錯: error LNK2002:unresolved external symbol "functionname@nn " 提示程式中引入的函數符號無法識別,這時只要將DEF檔案中相應的函數名稱改為functionname@nn方式,重建立立
LIB,重新連結即可