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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!2 h( Z% @$ c! Q' j( k7 e) ?
# X( H9 {9 ^: _! Z& _0 r
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
" ^8 b: I- i6 c( R EXAMPLE:
  c! e( V/ m7 O0 Q. Y  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def9 Z5 N5 _) ^2 v, {- ]" J# L

+ M' t6 o& J1 c+ I2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件7 H  ~; E; v8 M& U# E# z
EXAMPLE:
# o* Z4 E( x$ Z0 ~& C! `: D  VideoDeCoder.DEF 文件内容如下
; H" p9 Z, {& K& @9 \                                                                 ; j! c  X0 X7 h8 j' a8 n" ^
        Dump of file VideoDeCoder.dll                                 
  A: ?& W( q6 ~: O                                                                       
+ P: u3 w) n2 o( G" _        File Type: DLL                                                
: w! b- j& }. h% o% s% m                                                                       
) `2 N  N$ |, [% J          Section contains the following exports for VideoDeCoder.dll  7 U7 H/ m. B2 e: b2 h
                                                                       
* h. |" Q8 l% y& v* @. O2 o2 I: o! g                   0 characteristics                                   $ B/ L6 y0 m' Z- ~
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
- K: D2 r; q5 `, A0 {. z, x                0.00 version                                           ' N7 s/ E' I; q; R3 m: l3 [+ I
                   1 ordinal base                                      
& Q. @& X2 t' Y0 a4 H4 ^                  11 number of functions                               # N7 L5 S2 C" G& C! L$ z) C8 O
                  11 number of names                                   . _5 g5 c3 i3 h
                                                                       
# ^( N6 y. \9 w: q            ordinal hint RVA      name                                 
& K. G9 {% ^/ [                                                                       , `$ s* j0 J+ k+ u  q( a
                  1    0 00010F60 _TM_ClearDecoderBuff@4               
, h- ^) s9 ~2 t6 f0 c: V                  2    1 00010E80 _TM_CloseDecoder@4                   + b/ {4 q) K& ^! c  J
                  3    2 00010F00 _TM_DecodePicture@4                  
$ Z% {1 ]1 p, a5 K5 s% ?& U% _                  4    3 00010ED0 _TM_DecodePictureHeader@4            * S/ I9 A* a* o* J: b; W. U( T
                  5    4 00010FD0 _TM_GetFileEnd@4                     
( k# X; d$ G0 v$ M! G) w( }8 e                  6    5 00011030 _TM_GetUValue@4                     
3 d& S7 L: y7 @                  7    6 00011060 _TM_GetVValue@4                        e% n. O3 D$ p# Z8 j+ o  s
                  8    7 00011000 _TM_GetYValue@4                      / h  j+ l! _9 d) w
                  9    8 00010E10 _TM_OpenDecoder@8                    
1 w4 r1 d9 c7 h                 10    9 00010F30 _TM_ReturnType@4                     
7 {- M7 m) U* _) r4 R* `                 11    A 00010F90 _TM_SetFileEnd@8                     4 y, J2 z* B6 z, W) G1 L5 V2 F3 K# w
                                                                       
( G& s* j5 `4 \$ w          Summary                                                      4 b5 U9 A: F# Z1 r3 g& e0 C  G
                                                                       
. i; K* f$ i6 H* `1 x$ a) R2 p; f! j                2000 .data                                             2 F0 F3 b% r& ~( I
                1000 .rdata                                            
' S: Y' }* @* Y                1000 .reloc                                            ' R3 m" [( [0 W# l2 ?- [
               15000 .text                                             3 u2 y5 W- w* }8 k/ S
  按照以下方法整理:  P4 u: S7 T+ R0 O! T8 V
  1>添加LIB说明
  N, b  l3 D4 A0 d; ?, D& V& C   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
- G% O+ ]5 x  E2 {2 Z            DESCRIPTION "VideoDeCoder library"  
( @- z5 n; G5 n# P0 J; b5 V7 b        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
0 O) d- U/ f& k3 q- E% s1 F$ L; E         LIBRARY "VideoDeCoder"
/ w5 @( c  M" a   DESCRIPTION "VideoDeCoder library"" ]8 B% ?) l( N! |' m% z
   EXPORTS* Q1 E( H: S6 D3 N; v
            ordinal hint RVA      name                          
( |( e3 Y: ]- `; q' U                                                               
4 p4 Y' }& ~6 K0 {0 g5 x# i! T                  1    0 00010F60 _TM_ClearDecoderBuff@4            " u+ m! A2 s; ~, j
                  2    1 00010E80 _TM_CloseDecoder@4            
* o2 C  |" H" i; B$ v& H                  3    2 00010F00 _TM_DecodePicture@            ) I, z% M. e: ?$ C
                  4    3 00010ED0 _TM_DecodePictureH            
3 h8 V1 O* O4 Q! i3 E: r; |                  5    4 00010FD0 _TM_GetFileEnd@4              ) Q1 b9 A! |$ Y
                  6    5 00011030 _TM_GetUValue@4               
% m# i$ G. e9 Y& t                  7    6 00011060 _TM_GetVValue@4               # I% t& u7 D3 r; m' l
                  8    7 00011000 _TM_GetYValue@4               8 R+ R8 {8 T( S' o! n& z: C
                  9    8 00010E10 _TM_OpenDecoder@8             # [, a4 u5 b: ~
                 10    9 00010F30 _TM_ReturnType@4              # @1 }" e( O& c- Q( r6 f- Z, R
                 11    A 00010F90 _TM_SetFileEnd@8     ) o1 i. m6 h, x
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
1 O1 S, d% F" F6 V        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
. h8 d* Z# K5 c: e6 b6 Y$ X        最后形成.DEF文件如下:
/ J: J; ?( v1 e+ I: w        LIBRARY "VideoDeCoder"
, w5 ]; m# }$ D( k% g6 d8 L  DESCRIPTION "VideoDeCoder library"
( p7 z' R8 ~/ _) l  EXPORTS
  l  d2 [' [" @$ x/ ~) ~$ Q; t      9 m+ m* b. {1 K5 X
  TM_ClearDecoderBuff@4             @1    & F! {( y" X" u) [
  TM_CloseDecoder@4                 @2    : x6 w7 ]" h4 f- z  k  p! ~  S
  TM_DecodePicture@4                @3    # n1 [& p# K$ @2 J' Q: ]) n
  TM_DecodePictureHeader@4          @4   
! m" H. R* }$ N  TM_GetFileEnd@4                   @5    ! {; w4 J+ \7 G4 a* B
  TM_GetUValue@4                    @6   
5 x" [* m* n$ j7 l0 [  TM_GetVValue@4                    @7   
% N7 ^+ {2 U0 G1 n  TM_GetYValue@4                    @8    1 ^# I* }4 i9 Q+ w2 Z# `- t# z# s; y
  TM_OpenDecoder@8                  @9   
. s$ R+ C; {. H2 e+ l/ `/ M- D  TM_ReturnType@4                  @10    6 N2 s: J" ^& N
  TM_SetFileEnd@8                  @11   
% U0 ]3 f$ F1 J3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.. V5 N7 h& c* i- I9 K
EXAMPLE:9 V" t( B9 N) U1 s. x2 B) k
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86& V1 m7 ]. x$ f4 i
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:  E* ?/ |; m% `4 n- D
error LNK2002:unresolved external symbol "functionname@nn"" I: X8 Q: o# G; @3 _" u$ ?
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立) }9 L/ j7 ~  {  N
LIB,重新链接即可.
) K. [% s" h. q/ U9 B6 k% O% a/ U/ q. L! z
这样就制作成功了符合VC调用方式的LIB了!1 c3 G9 M8 g5 V$ |3 n. B
参考:MSDN2000
! w) z! v1 `: \! j) R" J要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
: F) r& g" y  x7 @IMPDEF xxx.def xxx.dll& q: o! Z" S( ]! V+ Z
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
+ p2 {) n+ K. a8 G" I9 {而在C++BUILDER中!9 B% E4 n7 Q5 o$ m& K
__cdecl的函数输出前会带一"_"
" S. U) G1 j. V__stdcall无特征,只输出函数名- Q8 c+ n$ Z# l$ w3 Y
__fastcall函数输出前带一"@"7 I8 j. N! w# a+ V
都无"@nn"后缀格式!
" ~$ P5 h& _5 P6 `+ K在VC中!2 F9 ~8 D" p9 A: q* T& A1 m
__cdecl无特征,只输出函数名
  s. {  v, S5 \* E7 x1 M__stdcall的函数输出前会带一"_"后缀带"@nn"! k6 D$ G; d" |0 w2 C9 N. X
__fastcall函数输出前带一"@"后缀带"@nn4 u% ~* `- U( E. ^
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:51 , Processed in 0.018059 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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