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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
' J' P$ x+ L  D4 o, }- V, u
3 [% w5 S. G" U: ?/ z6 w& \9 p1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件" R; N2 n1 D$ N, C& E/ e
EXAMPLE:( y5 A/ [5 k! k1 k6 h* ]
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
5 W8 Y: u7 \  O3 r, S# }) {
  J$ j/ U1 ^  ~$ B  M9 V3 u2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
' |6 _% ^- ~3 S8 V' }3 {" j/ v0 M EXAMPLE:
8 c7 M2 E) y5 H  r% y# Q* j  VideoDeCoder.DEF 文件内容如下
1 Z5 |- X) Z1 x4 x% K% j4 Y                                                                 , ~8 E! r! A5 \8 k
        Dump of file VideoDeCoder.dll                                 
* E3 @" F! e8 M/ w# A/ M                                                                       8 n/ Q- i! v# d
        File Type: DLL                                                
) S. l9 F$ H) F% N1 o8 t                                                                       * }8 w- d4 @! L, V" C
          Section contains the following exports for VideoDeCoder.dll  5 c$ v% ?4 H6 @' b# H3 J
                                                                       
' `; R* m* o# T0 J) w; ^                   0 characteristics                                   
. L) Y8 q! I, `  B5 ^! c& p# b            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          ! `  g8 R' t5 {
                0.00 version                                          
, W& Q) o, \( w4 M                   1 ordinal base                                      $ r/ f+ ^+ C# u' D; S4 z
                  11 number of functions                               & D% G' M) x; Q; j, Q1 @: I9 |% |& T
                  11 number of names                                   
9 m6 N) T/ n0 t9 E                                                                       
) E4 f, b) B/ C% ~            ordinal hint RVA      name                                 
$ o9 s' f- J) G4 Z8 ~/ a0 _) a                                                                       1 Q/ S! G0 e) \! d: t
                  1    0 00010F60 _TM_ClearDecoderBuff@4               8 q0 b3 c; R) |8 d! G
                  2    1 00010E80 _TM_CloseDecoder@4                   7 j) y0 I  ^" ^; B' E, z8 z
                  3    2 00010F00 _TM_DecodePicture@4                  
4 T; j) e3 E% k+ }9 ^! d( y) i1 d                  4    3 00010ED0 _TM_DecodePictureHeader@4            
9 p; D( a+ d3 n                  5    4 00010FD0 _TM_GetFileEnd@4                     ( u: A1 I( P4 k# E7 v" b. F
                  6    5 00011030 _TM_GetUValue@4                     
: Y' a3 |. |% V/ Q                  7    6 00011060 _TM_GetVValue@4                      1 _: F4 Q8 N, f+ Z
                  8    7 00011000 _TM_GetYValue@4                      2 u1 v" y0 d1 G8 |. h1 M3 k' x
                  9    8 00010E10 _TM_OpenDecoder@8                    
7 w* n7 S5 s0 B                 10    9 00010F30 _TM_ReturnType@4                     
, T9 [9 Q- O1 J! [; M" o9 w0 {4 d                 11    A 00010F90 _TM_SetFileEnd@8                     
5 d* F. [- q  F+ {                                                                       0 r. h4 S1 A* |( H
          Summary                                                      
! i1 y/ R/ C' Y' @& n                                                                       
) }! `  E3 W- x' h* H  c" ?  ?                2000 .data                                             : h  m9 w+ d. _5 U$ b: K/ y$ L) P
                1000 .rdata                                            0 X# B/ X3 _1 y; y+ p
                1000 .reloc                                            
: u- Y7 j0 W1 g2 [0 ~3 k               15000 .text                                             : i$ X% G5 m1 X& a: G
  按照以下方法整理:6 g6 h0 y4 g2 j3 T; ]2 h: o
  1>添加LIB说明
; \/ p4 ^4 V- o7 D+ v8 {" L1 O   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称8 l+ o  t* a! e. i# U
            DESCRIPTION "VideoDeCoder library"  
$ E7 p( W9 s; Y7 U* A1 K3 ?* f        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数3 q( _2 y, m, ?; E2 [$ \
         LIBRARY "VideoDeCoder") l0 l- v$ `, x
   DESCRIPTION "VideoDeCoder library"
3 x! M6 L) e; I% X: E   EXPORTS
' P, l3 v5 H' o            ordinal hint RVA      name                          2 Q) V0 Y* b- }
                                                               
4 P3 a6 ~5 Q7 T% b2 W9 C, u& l6 h! r                  1    0 00010F60 _TM_ClearDecoderBuff@4            0 w8 }6 H/ Q" P  x/ u
                  2    1 00010E80 _TM_CloseDecoder@4            
9 q. n8 R% T& a                  3    2 00010F00 _TM_DecodePicture@            8 D3 m6 I# l( G7 Q% f8 _" c
                  4    3 00010ED0 _TM_DecodePictureH            
* u; x2 c9 f6 s. A" ~1 t# Z                  5    4 00010FD0 _TM_GetFileEnd@4              8 ~) Y1 y3 ~: C" a. P5 |6 _
                  6    5 00011030 _TM_GetUValue@4               9 @& l5 U8 E- @$ B5 d
                  7    6 00011060 _TM_GetVValue@4               , w. ^& u  f4 E8 l3 Q
                  8    7 00011000 _TM_GetYValue@4               ! |7 g6 u( M8 @& I* W& e: P
                  9    8 00010E10 _TM_OpenDecoder@8             $ B  W' d7 b! }7 G2 t) j
                 10    9 00010F30 _TM_ReturnType@4              ; K4 [) C8 m; L" S8 X; e8 b7 s6 ?
                 11    A 00010F90 _TM_SetFileEnd@8     
* M+ o  a. @7 N, t. p6 \        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
0 g! \6 {: }" _+ I        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
! ^/ s! J( E+ j# p' ~        最后形成.DEF文件如下:
& G" V! T2 Z/ g% x8 F( s        LIBRARY "VideoDeCoder"
7 m9 |5 f3 w# F  ?  DESCRIPTION "VideoDeCoder library"
( r. W0 _7 {  E6 h* O  EXPORTS
# {; T' h" o! i$ R7 y/ J" {      8 Q$ B$ u6 X% [. q3 ~
  TM_ClearDecoderBuff@4             @1   
$ f1 b* Y; g& m) M  TM_CloseDecoder@4                 @2   
5 ]8 P( q$ g( j. }* A  TM_DecodePicture@4                @3   
7 D0 ]) u2 l6 @0 V  TM_DecodePictureHeader@4          @4    7 g0 x& z3 H  y; h  S# {6 ]" g
  TM_GetFileEnd@4                   @5   
5 Z7 M( W% D8 K9 g2 G# w  TM_GetUValue@4                    @6   
4 V& ~6 y: W1 c& A: V  [  TM_GetVValue@4                    @7    0 y8 H8 j" P+ v. E! i- R, |" ]: X
  TM_GetYValue@4                    @8    ( E  u0 o, ~" a0 K5 @
  TM_OpenDecoder@8                  @9   
# X$ g7 T) [/ Q4 Y  TM_ReturnType@4                  @10    5 {% n9 `+ w4 H- I7 E
  TM_SetFileEnd@8                  @11    & a+ [3 n% S/ {) n3 s- a7 q
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.3 c1 @$ K+ v: E+ ?
EXAMPLE:- K1 `. u2 Q7 {
  LIB /DEF:VideoDeCoder.def /MACHINE:IX869 ~9 B; e& R( k& H% }/ C  H
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:7 x, y  J% C" w" V6 m0 s: e3 U
error LNK2002:unresolved external symbol "functionname@nn"
4 @6 ?/ U% Q7 Y) Z/ F提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立0 j1 ]" d; f6 h+ t
LIB,重新链接即可.
6 E3 e, m+ i1 G  A
7 [0 _: G, i. D& z3 B这样就制作成功了符合VC调用方式的LIB了!
" w- X, ^1 ^* c- f. \5 P4 O参考:MSDN2000
" d" x+ U. _4 O9 S' H2 c1 @$ o) s要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
- x4 b% r, {) `8 f- q9 ~IMPDEF xxx.def xxx.dll
  C7 i2 m! G6 x& f这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
$ G9 x/ O* g. [而在C++BUILDER中!+ |; H2 b8 v$ S* R9 {; e
__cdecl的函数输出前会带一"_"
/ P4 q8 X1 b% l7 D__stdcall无特征,只输出函数名8 M' h0 k' F: C' w. \3 C
__fastcall函数输出前带一"@"
8 J- [) ]  ]  l. T+ {% @都无"@nn"后缀格式!% m/ D5 W" t9 i" ?; ?  q
在VC中!
2 O* _2 w" e: ~6 O__cdecl无特征,只输出函数名, l% A8 p" i, M: H0 F0 ]9 g
__stdcall的函数输出前会带一"_"后缀带"@nn"
' W% o- G6 Z( p__fastcall函数输出前带一"@"后缀带"@nn
9 C1 l; w& _* U0 |0 i只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 12:09 , Processed in 0.019310 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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