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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!* O! \6 `7 F2 B# x: `
9 ]: H0 B; U" N( V4 n; R1 L
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
3 \$ D4 ]9 b) n) i" k5 c EXAMPLE:
2 B; v( ]. H6 w2 B# T# S  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
0 C. j2 l1 M2 f! N0 Q2 y9 E
0 n: X5 B0 N. B! Z0 X9 ^/ w2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
0 l% J' |$ N( X9 d3 Z EXAMPLE:3 e0 s$ i) n$ A0 \
  VideoDeCoder.DEF 文件内容如下: V/ t/ k- z; p8 e# Y
                                                                 
7 ~0 b# W1 V. z        Dump of file VideoDeCoder.dll                                 
' Z6 m0 K- x5 a0 X% h9 l, [                                                                       0 H4 m& Z' i! L; T
        File Type: DLL                                                
3 t2 V- Y& x  {& U, T                                                                       ! ^! H* X  {; B. a
          Section contains the following exports for VideoDeCoder.dll  4 i) T+ p8 e+ s7 c0 P
                                                                       
# O( z+ g- O/ J5 D& U: U8 b/ Q                   0 characteristics                                   , m. G3 T/ E" y# n1 `
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
2 X) [( b# X' y/ U                0.00 version                                           ( ?' A: ?; B' j( k) c
                   1 ordinal base                                      : W4 Z7 B4 N9 ~8 A8 U1 t1 z
                  11 number of functions                              
, B. u5 R6 l! z  x                  11 number of names                                   
; O: @* j) J7 Q! V: W                                                                         E9 A" O! ^5 \+ ]; g0 A% d( J
            ordinal hint RVA      name                                 + ?8 r8 |$ F7 a- Z: O
                                                                       
* G0 x* c+ O$ J6 y$ h1 B# o                  1    0 00010F60 _TM_ClearDecoderBuff@4               
* V& f6 V) J9 Z+ Z/ @  q4 r5 M4 s( e                  2    1 00010E80 _TM_CloseDecoder@4                  
5 |5 W4 A1 r8 ]) {# |) G3 Z                  3    2 00010F00 _TM_DecodePicture@4                  
: G" E4 v8 e- j: T                  4    3 00010ED0 _TM_DecodePictureHeader@4            ( Q8 S" ?! r' s6 `* }
                  5    4 00010FD0 _TM_GetFileEnd@4                     0 }1 N! h. W1 g( Z
                  6    5 00011030 _TM_GetUValue@4                     
& V4 W' `- Z* f8 K" @( h                  7    6 00011060 _TM_GetVValue@4                     
) Z  z0 [" L) N                  8    7 00011000 _TM_GetYValue@4                      $ [5 W( D$ h8 R6 A
                  9    8 00010E10 _TM_OpenDecoder@8                    
6 S" w, D- t; |# m                 10    9 00010F30 _TM_ReturnType@4                     
% c; @  j. D" ?. C  t" V                 11    A 00010F90 _TM_SetFileEnd@8                     
1 z  B% l  [( ~$ r                                                                       
2 A, e; C, T% B5 Z7 D4 ~          Summary                                                      
$ |9 T- N; y/ D; p* ^                                                                       
* d% l/ Y' S7 Z5 A                2000 .data                                             
. P: ]" H; g8 [0 i                1000 .rdata                                            
( H' N# P9 i! c                1000 .reloc                                            
. H) ~: D3 L% _$ W6 f4 A               15000 .text                                             4 {7 O0 |! r( I7 U6 ^
  按照以下方法整理:$ @' m& O& @) c( d0 N9 I
  1>添加LIB说明+ T( _9 E9 a4 Q3 x8 F1 u! g
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称1 K, \. ^2 Q2 Y: F
            DESCRIPTION "VideoDeCoder library"  * G) g# v" M% ]* J/ X
        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
/ N2 ]! F) g2 a8 l3 r         LIBRARY "VideoDeCoder"
+ V7 R, o5 Q* t4 r( n   DESCRIPTION "VideoDeCoder library"
; z( j/ v& x5 h  J3 _. U   EXPORTS' `0 \3 X) Q* n- Z6 d( T" |
            ordinal hint RVA      name                          ! W5 `) D4 p! P% M8 g/ h
                                                                + P8 y( \5 A' r3 Y, [! U7 m- |
                  1    0 00010F60 _TM_ClearDecoderBuff@4            / I3 x' @* U/ R% @6 ]
                  2    1 00010E80 _TM_CloseDecoder@4            2 @* z) I2 _4 T9 l
                  3    2 00010F00 _TM_DecodePicture@            . o, }4 ]! A" U4 I- c
                  4    3 00010ED0 _TM_DecodePictureH            3 x7 _8 r; y1 m5 m- o# z
                  5    4 00010FD0 _TM_GetFileEnd@4              
3 }8 a7 Z3 U2 k& I* [6 v                  6    5 00011030 _TM_GetUValue@4               ' f4 q" K5 v4 T/ e% S/ k
                  7    6 00011060 _TM_GetVValue@4               & y* E5 C: Q. N, A' A! O* u
                  8    7 00011000 _TM_GetYValue@4               # m4 |7 W+ A* j6 q+ @2 G
                  9    8 00010E10 _TM_OpenDecoder@8             ) |5 m" Q5 O" s9 x1 y0 |) |
                 10    9 00010F30 _TM_ReturnType@4              & r' h3 u0 m; ?' X: Y0 K: r
                 11    A 00010F90 _TM_SetFileEnd@8     / r( T- H* K6 ]
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号7 s* O$ T+ ^0 U  c% h/ b( O
        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").( c; I3 L5 H9 f7 x: g; f
        最后形成.DEF文件如下:
- l' N# _; q9 C% T8 r) c        LIBRARY "VideoDeCoder"5 H( ^) y7 g8 R* `0 K
  DESCRIPTION "VideoDeCoder library"
2 w+ j& h- M( c5 W$ q  EXPORTS& u$ A% r. k. ~& s( ?
      / ^2 \( Z6 x  o( E# }1 _+ j
  TM_ClearDecoderBuff@4             @1      B! h( _" s+ n) `9 d! ~
  TM_CloseDecoder@4                 @2    8 Q/ r6 t$ y2 S# |1 g
  TM_DecodePicture@4                @3   
& r: [8 C9 C7 q- I6 c+ \  TM_DecodePictureHeader@4          @4   
9 T/ L; O0 M$ s; v) _5 ^( Q. q. J  TM_GetFileEnd@4                   @5    0 B1 K$ y- V; O7 k; X
  TM_GetUValue@4                    @6    3 V+ Q2 {. ^8 g1 j  m  {3 \: f
  TM_GetVValue@4                    @7   
3 D& J. h  k* D/ \  TM_GetYValue@4                    @8   
/ A; @7 ^; m# i1 u  TM_OpenDecoder@8                  @9   
: e7 E- ~: E# Z1 J# G& B  TM_ReturnType@4                  @10    & @6 e3 P9 g5 p$ \
  TM_SetFileEnd@8                  @11   
# }% S! H! e! J9 D- _% K- [) K3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.; G! B6 {) L! P% G' S
EXAMPLE:  B( A. r" a+ \% F8 i8 N2 W
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86
9 T0 M( @2 ~/ [4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
. P1 O0 B+ @# ?" c0 T error LNK2002:unresolved external symbol "functionname@nn": J( W, G" h# a& }: x  B
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
3 F+ ]9 E6 V% V1 Y- MLIB,重新链接即可.
8 C& `2 l2 `4 v% ~. v
- M" ?/ _# ^5 X9 S8 Y9 K  w9 v) ?这样就制作成功了符合VC调用方式的LIB了!
, G" v" o1 C/ U参考:MSDN2000
; c% x' ]9 z9 E0 ~2 a. ~: F3 T+ k要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
; M5 N, }- m  [( w) P$ w% ]: GIMPDEF xxx.def xxx.dll
" Z8 A, a! B. r7 u+ j这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:9 ?3 L5 X0 E; R8 t' \2 }
而在C++BUILDER中!" F  C( o2 i8 W" \- f
__cdecl的函数输出前会带一"_"
# {- o9 ?$ d' \. ]__stdcall无特征,只输出函数名% }0 }; Y8 f: y0 M
__fastcall函数输出前带一"@"
  i9 }$ W% @; Y0 v' c, T都无"@nn"后缀格式!6 i% F4 R4 E5 Q9 l% ?+ F: o
在VC中!
& Y% b& p' _; V5 C" j9 I- |2 t  [__cdecl无特征,只输出函数名5 X  g$ ^5 q7 i1 g! L
__stdcall的函数输出前会带一"_"后缀带"@nn"
# d" G  H( P5 q__fastcall函数输出前带一"@"后缀带"@nn3 [: z' S3 D4 S& d% T6 r. ~
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:10 , Processed in 0.019130 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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