找回密码
 注册
搜索
查看: 4354|回复: 0

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!! v, m  e0 _6 @0 _/ M* X2 Z

$ n& `# s/ |9 q! T9 S1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件2 }% ~: `# P/ f5 J5 k
EXAMPLE:4 v! u7 s: h7 J) E3 h; W
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
  M! R& z: ~2 \# P3 }5 ~ 0 g) e/ P/ P( d9 E* L0 D
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件9 H) y  J. m4 n8 z* [, ?! B
EXAMPLE:. X' m% Z& N4 }+ y, y2 @* H* S! L
  VideoDeCoder.DEF 文件内容如下  l- U  U, p% S* O' u( Y
                                                                 5 d3 p5 i; x1 ?2 K* ^$ m
        Dump of file VideoDeCoder.dll                                 
4 i/ W7 h' b3 Z                                                                       ) T  X5 y, r7 c2 x$ e5 P8 M
        File Type: DLL                                                
3 P8 \' P0 f1 T% n                                                                       % A: m8 L) g6 _% I3 y! m
          Section contains the following exports for VideoDeCoder.dll  0 ]" s* t( L3 z2 l; o& c
                                                                       5 H! I5 s: ~2 s* B: o! [6 `- S
                   0 characteristics                                   
. b2 `+ e! b6 Y            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
  @  F0 @2 _* ?, u# s% A2 T                0.00 version                                          
2 Q- h6 k  @! D6 {5 g3 e  M- y, X                   1 ordinal base                                      
2 I; @+ ^" {) C, w. Z: A: ^                  11 number of functions                               ) K1 j/ y4 }. ?) O" _  j
                  11 number of names                                   
6 h4 r4 g9 ^3 v( l! }7 [% E                                                                       
, L% B: ]: {, o: Y, i            ordinal hint RVA      name                                 6 P  Y; w  o2 L7 K  q
                                                                       
, e# J7 O: m, w9 [7 |( A7 C, ^                  1    0 00010F60 _TM_ClearDecoderBuff@4               * p8 w; ^2 N: U! a# g: g5 p
                  2    1 00010E80 _TM_CloseDecoder@4                   + N. w, t8 W1 p6 m3 K6 P" s
                  3    2 00010F00 _TM_DecodePicture@4                  
1 H$ k( `0 W/ k                  4    3 00010ED0 _TM_DecodePictureHeader@4            1 n( H: m0 B0 V+ c* |
                  5    4 00010FD0 _TM_GetFileEnd@4                     * Y9 s! A+ s0 s. q/ I* _
                  6    5 00011030 _TM_GetUValue@4                      1 P" q) p4 U! G! ]; x9 G( G
                  7    6 00011060 _TM_GetVValue@4                      ! B$ z8 P& C: e8 g$ b0 H, E/ V2 T
                  8    7 00011000 _TM_GetYValue@4                      & I! t& p2 z3 V9 `# A/ S
                  9    8 00010E10 _TM_OpenDecoder@8                    
8 U' c3 s) ?2 _                 10    9 00010F30 _TM_ReturnType@4                     
% ?5 s$ J, ^& L* E                 11    A 00010F90 _TM_SetFileEnd@8                     2 _, O) ]9 X% Z4 Q3 J
                                                                       ' X( z! |: }/ H- Y8 @# I+ I, r
          Summary                                                      9 V; Z& _" G. W: w" s# q
                                                                       
7 v# Q2 |& N: n1 U' Y$ P                2000 .data                                             
6 U0 w9 n. O1 d/ c( }. w& M  u3 m                1000 .rdata                                            ! s7 \  Y; W. `. {" P! F5 |
                1000 .reloc                                            - o+ x- S( n  O0 j8 K% |! _
               15000 .text                                             
0 H1 V0 A0 O* A% |8 d7 l  按照以下方法整理:
/ M# a' t, z; i1 a5 G# |) R  1>添加LIB说明1 a9 ]! b1 B* [4 ]2 q! [
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称% y# N" _* p3 O
            DESCRIPTION "VideoDeCoder library"  
) `) y4 n; r5 I! h        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数' {1 K0 }7 c; G: |5 B* C
         LIBRARY "VideoDeCoder"
( q  F; H! r- x) {( p! h+ y9 Q   DESCRIPTION "VideoDeCoder library"
! ~! A( h! c5 N8 j  _3 P' [: B7 R   EXPORTS
: l& n. o- t& T: M. r: r8 _* j            ordinal hint RVA      name                          
) ~) J) c! L6 ]+ H                                                                * F7 f: x3 n0 \
                  1    0 00010F60 _TM_ClearDecoderBuff@4            ; ?, Y$ x1 |7 l' g; N+ r6 E
                  2    1 00010E80 _TM_CloseDecoder@4            
# m; u! l9 ]: E                  3    2 00010F00 _TM_DecodePicture@            
: d# x- W1 i- t2 C) s% g5 A, l                  4    3 00010ED0 _TM_DecodePictureH            $ {; c  W7 s5 A! b& W& n$ z
                  5    4 00010FD0 _TM_GetFileEnd@4              ' F; L5 x$ v4 t. b  |( a" e
                  6    5 00011030 _TM_GetUValue@4               6 y* v2 o& Z2 x, T" L8 ]
                  7    6 00011060 _TM_GetVValue@4               
& X9 H4 ?+ E- W6 `& `: w                  8    7 00011000 _TM_GetYValue@4               & C; N% C# K4 q2 y8 T4 p
                  9    8 00010E10 _TM_OpenDecoder@8            
. V; u  Z  D, R$ {6 k                 10    9 00010F30 _TM_ReturnType@4              / N* g1 N+ P% L7 W
                 11    A 00010F90 _TM_SetFileEnd@8     & g6 n  Y# t& [2 I1 \( \
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号, {6 D4 s6 P4 z9 U
        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
, v$ I/ N. I4 B) I) ^: _        最后形成.DEF文件如下:
! I: h- z0 G( R2 X        LIBRARY "VideoDeCoder"9 a# A# u6 L$ h6 _# v
  DESCRIPTION "VideoDeCoder library"
, ^/ K& ~- o' Y, j  EXPORTS2 q) A/ w$ v4 P+ e0 ~( R
      7 j. `  a$ L5 L0 ]2 o! K( I
  TM_ClearDecoderBuff@4             @1    3 C5 U% L, ]3 q! D% Q0 [& n) B4 S
  TM_CloseDecoder@4                 @2   
2 R8 A* v" h, Q  TM_DecodePicture@4                @3    % t8 @  }  V/ Z: p+ e
  TM_DecodePictureHeader@4          @4    ; [% f. v0 y  P$ p3 s) ?& i. S
  TM_GetFileEnd@4                   @5    : b) J4 M1 n8 M" t+ e
  TM_GetUValue@4                    @6    , A8 i7 r# j( Q$ Y
  TM_GetVValue@4                    @7    : R5 q9 S$ K4 }' q$ S' T
  TM_GetYValue@4                    @8    / R+ |. `' e3 Q7 N: i
  TM_OpenDecoder@8                  @9    2 q* e8 n! @4 C/ Y5 l. X  J& e
  TM_ReturnType@4                  @10    ! m6 n, X& T2 T4 f# l
  TM_SetFileEnd@8                  @11    ; \  @# m7 D) I
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
( z. P! y6 G) R EXAMPLE:: @& e$ Y2 z1 {) H* Z& I
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86
- }- g; Y2 l$ P4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:( g, ], h  `8 U  D+ y7 Z
error LNK2002:unresolved external symbol "functionname@nn"
2 f  O6 L: w6 n8 F+ [' N提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立! u1 k% Q0 j: i
LIB,重新链接即可.
4 l+ a9 i  T" z6 Z3 Z% r
  E( A: c. G7 K* k4 u这样就制作成功了符合VC调用方式的LIB了!8 y4 l: V3 W) C0 ~- _5 V* a
参考:MSDN2000
: z6 S1 b: ]6 U, ~0 U' ]- c要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!: H, e" ]# D& o  ?% d, e, M
IMPDEF xxx.def xxx.dll
* K! ~, U% A. G6 @' |这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
' U4 w# r( [8 O而在C++BUILDER中!
- r) l6 C3 x, G" E9 ?4 W8 `__cdecl的函数输出前会带一"_"% j3 L1 a* x% ?( t# @7 b' e" W
__stdcall无特征,只输出函数名
% A' k4 Q' [8 v__fastcall函数输出前带一"@"
% z* a% {- P4 h# G) w* Q都无"@nn"后缀格式!
" R+ q; f' y- Y: D8 I6 e$ _在VC中!# ~* a; n$ {9 v1 B& E- r/ d
__cdecl无特征,只输出函数名+ b, J( r; k0 b  X3 S6 ~# K
__stdcall的函数输出前会带一"_"后缀带"@nn"
& X0 O- H* \; f2 {__fastcall函数输出前带一"@"后缀带"@nn
! g% f6 k$ \& `, q  K. ~- F只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:40 , Processed in 0.017663 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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