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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
% P' F( S3 `/ ]. `! O) w) H7 Y8 v0 }+ a+ j
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
) D$ ?% q  j$ \4 N6 d( P EXAMPLE:
/ n  ~% u. g5 r3 G+ U  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
0 M7 l5 W( z- j3 l( V3 G! A   r, X2 \0 {# O
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件- N" Q1 f3 Z" |) N9 z
EXAMPLE:
, ^: n5 Z" C1 m$ ~6 i  VideoDeCoder.DEF 文件内容如下
6 |9 N  ^% g6 @+ @1 j+ i. @- `                                                                 " h. Q! g- A4 {# M; a# R' t  E; D+ x
        Dump of file VideoDeCoder.dll                                  5 k% e8 j6 t' Z  c9 f# y, ]4 }' ~
                                                                       
+ ~+ ]4 A, _2 T* Y% {        File Type: DLL                                                
% s* {! n+ z( h8 Y' P                                                                       
2 ^# T! i& m9 o! f. l9 {3 d6 z; n          Section contains the following exports for VideoDeCoder.dll  
/ i& s" E: L* `6 V; r                                                                       
( N0 z# G! ^; s( J" P                   0 characteristics                                   
0 o3 v$ z( {7 K8 v" O            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          4 D6 o1 c7 G0 {3 H! ^) F5 r7 B( P2 b
                0.00 version                                          
0 ^/ x% ?: A; X( `/ y- d" ^                   1 ordinal base                                      
6 c1 D! a1 z7 u5 T                  11 number of functions                               . w1 H% n0 @$ I) b1 b# T" z
                  11 number of names                                   
- ^5 l1 b7 e/ j1 O8 A9 l                                                                         w$ V, `5 ~: I2 H/ C* u& G- Z
            ordinal hint RVA      name                                 
4 \  m/ {2 p6 d. {7 n3 y2 t                                                                         t4 ~( Z- V& D- w
                  1    0 00010F60 _TM_ClearDecoderBuff@4               ! M8 K, z1 p- v* M7 t$ E
                  2    1 00010E80 _TM_CloseDecoder@4                  
4 }& k$ W/ s- g0 E! ^                  3    2 00010F00 _TM_DecodePicture@4                  : v+ ~& E3 [" }9 \4 r4 s- E7 X
                  4    3 00010ED0 _TM_DecodePictureHeader@4            + o  R3 I6 N% E  |( I1 \$ ~
                  5    4 00010FD0 _TM_GetFileEnd@4                     
3 e' q: a  K8 P( S% }# f% U- `: X                  6    5 00011030 _TM_GetUValue@4                     
9 a* i' i4 k+ C. H                  7    6 00011060 _TM_GetVValue@4                      * ^' y3 H5 G$ w
                  8    7 00011000 _TM_GetYValue@4                      ' R4 W! }3 U4 K. w
                  9    8 00010E10 _TM_OpenDecoder@8                    / R  `% b: @; G( _
                 10    9 00010F30 _TM_ReturnType@4                     
- D, {& g0 U# C  P) O' r& v                 11    A 00010F90 _TM_SetFileEnd@8                     5 Z9 i5 M1 d, J5 c1 H: ?
                                                                       
9 s$ T/ t+ o( L3 \          Summary                                                      ( C" x4 U- c1 n# D
                                                                       2 B% z( g' ]* j- [6 z
                2000 .data                                             : L+ [; n7 Y1 ?- Y
                1000 .rdata                                            
0 O, S  Y/ R/ D2 b  p% `                1000 .reloc                                            & M! N4 O  O: A
               15000 .text                                             ' @. w0 Y( |! K. P
  按照以下方法整理:
6 B# k" X5 z6 z) k: J9 A8 Y  1>添加LIB说明% T$ I' e( y0 q  }% d* ?
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
; t( s+ h4 W4 F4 F! g            DESCRIPTION "VideoDeCoder library"  
1 R" h) r+ F4 `/ j" E% o        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数% F" B! r1 p4 u1 c! r  e
         LIBRARY "VideoDeCoder"
6 d) m$ l9 |; s# J2 J( p   DESCRIPTION "VideoDeCoder library"+ q3 y2 n8 o& ^5 R# a+ ?& ^
   EXPORTS
/ E) F2 k6 _. j            ordinal hint RVA      name                          ) c5 l8 |* i( x0 ~: Z/ \4 C* M
                                                                . `- I3 B# G6 V2 S
                  1    0 00010F60 _TM_ClearDecoderBuff@4            
0 y$ E9 _+ x" o1 B$ k" J& }                  2    1 00010E80 _TM_CloseDecoder@4            
, a# L9 e  v6 O: ]$ a                  3    2 00010F00 _TM_DecodePicture@            # G9 n/ q# |" P& B6 C- F
                  4    3 00010ED0 _TM_DecodePictureH            
1 Z6 U2 ~' z. d4 `( k4 @0 s) j' {                  5    4 00010FD0 _TM_GetFileEnd@4              ! N- L& c6 o3 S/ L
                  6    5 00011030 _TM_GetUValue@4               
6 D6 z) C4 b2 N6 c                  7    6 00011060 _TM_GetVValue@4               6 ]  w9 F7 C7 B% P
                  8    7 00011000 _TM_GetYValue@4               ) S" g' m$ V3 Q8 s9 c  i
                  9    8 00010E10 _TM_OpenDecoder@8            
' }3 A$ J! m  \                 10    9 00010F30 _TM_ReturnType@4              2 T. R! z, n5 ]7 @* h" P
                 11    A 00010F90 _TM_SetFileEnd@8     
' {1 ^1 O2 y7 h8 g. g* \: c7 ?: c        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号$ Q% y/ N1 m8 A
        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
* Q! o  o! _3 j' E# x4 u        最后形成.DEF文件如下:  K4 [; \1 d+ W& l
        LIBRARY "VideoDeCoder"
2 T) F; U$ e- w* [* m6 c  DESCRIPTION "VideoDeCoder library"
% G- a( C0 \) Q- ]/ S/ o: B  EXPORTS
: l$ Q% t3 F, U      # m( `2 ~. m* p# K3 L/ H
  TM_ClearDecoderBuff@4             @1    / D7 ^8 v; }* G
  TM_CloseDecoder@4                 @2   
  z. u& a, `  T' |3 {/ d  TM_DecodePicture@4                @3    - l$ q- c8 V4 N* N. @7 [. L9 v# s" u
  TM_DecodePictureHeader@4          @4   
% H  O: d/ t( q: L6 ?  TM_GetFileEnd@4                   @5   
; i7 @. O  S) ?/ ~9 U9 [7 k0 C  TM_GetUValue@4                    @6    ! q; ^4 V! N) p; }% Q0 n3 E
  TM_GetVValue@4                    @7    # Z4 D7 C* t7 \" R3 S$ G; d! O
  TM_GetYValue@4                    @8   
: c: |! q1 t8 p$ a  TM_OpenDecoder@8                  @9    1 v5 J: M& _4 }7 U1 G( w. f; T7 E" E
  TM_ReturnType@4                  @10   
9 ^7 w7 O/ i/ S: d" l  TM_SetFileEnd@8                  @11   
1 u  i% \1 U- O/ G1 K3 n$ A; g3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.( r  g1 }& A9 P  H/ R
EXAMPLE:( R, r5 l1 ^( G& Z4 d6 F
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86% e0 i0 I% Z4 J" n- q2 W2 j
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
% Y& K, D9 }6 B, X error LNK2002:unresolved external symbol "functionname@nn"! ~. @5 e2 C" M' ^5 F. L) b. p
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立. q) @0 e! ?2 v8 e6 |- }
LIB,重新链接即可.! L4 Z6 U- `5 }) n% L$ S: L
! j0 E* E% \- Q  j) ~
这样就制作成功了符合VC调用方式的LIB了!. a; t8 v9 z( w7 W4 s- Q0 g$ @
参考:MSDN2000
+ C( Z# |* w  y6 K要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!, m) r+ I4 |. b- ]) u
IMPDEF xxx.def xxx.dll
4 g. W- v# h& L( P0 S2 I这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
' k. J5 Z& y" P- {: L+ {1 r而在C++BUILDER中!. `& X: k1 S8 A  B
__cdecl的函数输出前会带一"_"7 W1 N9 p& ], [' S) ~6 m& V
__stdcall无特征,只输出函数名7 r2 r9 D. C7 |+ d, I& @# k
__fastcall函数输出前带一"@"% T7 b. v5 c% S2 ]) \% }. ]8 \  I( A8 R
都无"@nn"后缀格式!
/ R8 z2 G/ w9 N7 o在VC中!
4 z! U( {1 m' C" _. b__cdecl无特征,只输出函数名
; J) H8 }( m9 S7 u$ q9 O' F__stdcall的函数输出前会带一"_"后缀带"@nn", e- |1 t. ~; \  P3 G2 t
__fastcall函数输出前带一"@"后缀带"@nn& _$ C  |, h$ K7 w
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:09 , Processed in 0.017963 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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