找回密码
 注册
查看: 4428|回复: 0

VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
6 S1 v* z+ `( A9 J8 m5 F" U" |7 l' k& ~
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
5 V. o0 i, Z: X9 F+ ~2 E. C" ?: e$ h EXAMPLE:6 v- c1 I  n) j6 S: B3 J9 C
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
1 x" S, R5 p" g4 ? 4 o  |  r0 R5 V. |* U" X
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件7 q. }) x' E* ]- x
EXAMPLE:
) ^; I! ~  D9 U  VideoDeCoder.DEF 文件内容如下, Y) v4 Z. O6 t. I$ `  X
                                                                 
# e6 T# a7 [" N- s4 n        Dump of file VideoDeCoder.dll                                  1 y% ~3 i, m6 S7 D3 Y+ r# R1 a
                                                                       
3 S# X$ `+ Q4 \- F        File Type: DLL                                                 8 X: t9 B* S, u; \5 `; }2 H
                                                                       0 i5 r7 u( m+ z. g  ?
          Section contains the following exports for VideoDeCoder.dll  4 k9 z! J. a5 C1 u! F& R
                                                                       
9 c& P& N* N  F2 V0 B                   0 characteristics                                   
6 S; t9 V2 C# B! v% M! s. C/ W            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          + c" ]  h9 h8 X  Y
                0.00 version                                           7 n" W- ~1 x" b+ K: W$ }, [- `* W7 n2 K4 {
                   1 ordinal base                                      & @9 @6 {% @) ^! ~4 o  j, E& S# b' o
                  11 number of functions                              
; ~* D& N0 X5 F5 ~* G: v- q                  11 number of names                                   
# w- q1 Q+ h/ @: B) S, x% I8 c9 |3 e                                                                       % |, s. `5 I& _: p% _
            ordinal hint RVA      name                                 
# F* S+ Z1 C8 v8 q* H                                                                       
2 D; \4 P! J+ _" _2 c                  1    0 00010F60 _TM_ClearDecoderBuff@4               
9 q6 ^0 e+ c9 ]$ [( G6 [                  2    1 00010E80 _TM_CloseDecoder@4                  
5 m' H8 \4 p" K1 y( e+ J# t6 ]                  3    2 00010F00 _TM_DecodePicture@4                  
9 b1 B5 l  D# P* D  B2 x0 W                  4    3 00010ED0 _TM_DecodePictureHeader@4            9 R# U) ]+ w; }6 B- z! s- I
                  5    4 00010FD0 _TM_GetFileEnd@4                     / q% g5 F0 I3 f
                  6    5 00011030 _TM_GetUValue@4                      6 z6 U( [7 M8 W  ?7 I
                  7    6 00011060 _TM_GetVValue@4                      - {! ?8 u5 k0 K* T+ F7 j6 O
                  8    7 00011000 _TM_GetYValue@4                      : U' m; ?( P( o% ^! T$ ^0 V
                  9    8 00010E10 _TM_OpenDecoder@8                    4 m' W- a, H7 i6 E6 l" p0 t
                 10    9 00010F30 _TM_ReturnType@4                     3 E, }/ e% E, |: ^5 g
                 11    A 00010F90 _TM_SetFileEnd@8                     
! T8 A) K" m, ^. S* C                                                                       4 L8 k3 c' f4 x. h: b
          Summary                                                      * K" b# i5 _; @2 d( [% Q
                                                                       
+ i$ I, f4 v: T8 k                2000 .data                                             & n) }$ `9 D1 y8 S0 T
                1000 .rdata                                            ; ?1 W/ `0 A1 c' L1 r3 ?
                1000 .reloc                                            
0 r! g& F* _2 b& o               15000 .text                                             
3 E. f! Y+ M1 q2 F" m% D  按照以下方法整理:- S7 v; s2 w3 C- X
  1>添加LIB说明' f, e6 Z. r" k2 q: B
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
7 h* G2 g  Q: a/ ~) r            DESCRIPTION "VideoDeCoder library"  ' K* j! Y' t4 E7 E
        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
; W; w( a% f7 j         LIBRARY "VideoDeCoder"! O( z! M! k$ Q$ v3 n- _4 h7 A3 r" @- [* W
   DESCRIPTION "VideoDeCoder library"9 E7 O4 N  t2 q6 k# X
   EXPORTS& w  h' F& L1 R6 h8 G; l
            ordinal hint RVA      name                          
3 x- m$ r- D! B; Y                                                               
2 o8 d1 t2 i* s5 U' b; G                  1    0 00010F60 _TM_ClearDecoderBuff@4            , r: v4 u! I) D6 h3 @
                  2    1 00010E80 _TM_CloseDecoder@4            
: x7 `/ G) C' Y8 }2 D% s4 ]7 w                  3    2 00010F00 _TM_DecodePicture@            ! V) d2 {' h* y$ c. ?8 d
                  4    3 00010ED0 _TM_DecodePictureH            
  b! ~, `# c/ X6 I7 h6 ]/ X0 s: b                  5    4 00010FD0 _TM_GetFileEnd@4              
3 t% r& j! U, e, d& V' g6 k* y                  6    5 00011030 _TM_GetUValue@4               3 q% e  O( K' _1 R* m; k7 m+ Q
                  7    6 00011060 _TM_GetVValue@4               % \  K7 R. e  v  P, |1 _  y
                  8    7 00011000 _TM_GetYValue@4               
4 {7 ~, z" l4 O* _                  9    8 00010E10 _TM_OpenDecoder@8             - x9 N8 ^3 n0 @; u3 n. y2 ]+ G
                 10    9 00010F30 _TM_ReturnType@4              ; F: \0 P8 \7 w
                 11    A 00010F90 _TM_SetFileEnd@8     
# p5 i( q6 g  r, z        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
( N, ^3 B+ ?5 H( y        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").5 f/ K+ o. O5 P# m
        最后形成.DEF文件如下:
8 U4 y; x8 }1 P: M9 l" y# B        LIBRARY "VideoDeCoder"8 F+ q8 H3 I  ^/ z4 Y5 I
  DESCRIPTION "VideoDeCoder library"2 e1 b+ q/ h+ u) w
  EXPORTS1 m! E9 K, F+ T/ R. M4 l
      # |! q; X* b* ~( |% ^
  TM_ClearDecoderBuff@4             @1   
$ W- h. D% H9 x+ R" j! S. H  TM_CloseDecoder@4                 @2   
. @( P0 |5 ^- @. ]0 m/ ~  TM_DecodePicture@4                @3   
  V6 N+ [; l0 K! @  TM_DecodePictureHeader@4          @4   
% q0 s( k, h% T% C  TM_GetFileEnd@4                   @5    . @+ w9 P, P. z" w' e9 {
  TM_GetUValue@4                    @6   
/ W- O$ w8 E4 ~: `8 W  TM_GetVValue@4                    @7   
7 K# ^6 y1 y6 ]  TM_GetYValue@4                    @8    * q, G! o) ^3 S1 A5 }
  TM_OpenDecoder@8                  @9   
7 e/ Y( a/ q/ \; F* M. d  TM_ReturnType@4                  @10   
5 m$ W/ ?& d9 `# L3 G  TM_SetFileEnd@8                  @11    - {* Q4 w0 H& i
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
& r8 g9 B9 q3 f" C2 s" b6 w# h EXAMPLE:
# M1 m6 I% X/ K* X, S  LIB /DEF:VideoDeCoder.def /MACHINE:IX865 A7 L$ C1 J, t: p. \. J' j/ U
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:; ?% _6 H+ X% N
error LNK2002:unresolved external symbol "functionname@nn": x- ~7 O+ h- K% ^5 Y6 C
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立+ l4 G: h2 M6 H! i) ^; D0 M
LIB,重新链接即可.; r3 v$ G8 P( D: o
) Z% U" x2 K, |: p' P2 E
这样就制作成功了符合VC调用方式的LIB了!  \7 C6 m5 @. d8 Y
参考:MSDN2000
/ |  k+ ~/ P1 a- z* s要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!5 i" p  M* ?1 }7 A
IMPDEF xxx.def xxx.dll
& [8 O! m7 p5 n/ L7 w这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:# l) W3 j. n+ f
而在C++BUILDER中!  A1 I, h, y1 D2 a% P$ `
__cdecl的函数输出前会带一"_"3 i' [7 I9 y1 Z1 i6 Y+ _# g* [! m
__stdcall无特征,只输出函数名. V" P( N* s0 s" V' n0 ^/ ?# x- N
__fastcall函数输出前带一"@"% l! {" L9 \- ]3 l
都无"@nn"后缀格式!
/ _- i# z) k4 V% d, Z5 P+ j在VC中!- h! k0 T7 F4 V9 w" A
__cdecl无特征,只输出函数名
1 f4 Z+ P# A1 O9 M9 L- O9 c( o__stdcall的函数输出前会带一"_"后缀带"@nn"
# n9 E% \+ p. f__fastcall函数输出前带一"@"后缀带"@nn$ L7 x/ ^4 i" r, T  M* C
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-10-1 22:01 , Processed in 0.017184 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表