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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
2 n/ G" N, |+ K; J. k& v0 @+ a* G# ~! l- y9 ?
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件% H3 N- T7 ^; ^" h- h2 O
EXAMPLE:$ |: @: K% J8 \; c& L
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
; c, y' B, p/ p: C
# K+ _% k% B0 I9 D2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件4 |- t4 v1 v$ j
EXAMPLE:
2 i8 O6 Y9 {3 e% q- K2 P  VideoDeCoder.DEF 文件内容如下
2 D* o% }. S/ f  h4 D5 h                                                                 
  C6 z& l% h6 U. ?        Dump of file VideoDeCoder.dll                                 
9 O* ]# T- g0 `                                                                       
1 L# b- o- B1 ?) u  M        File Type: DLL                                                
" K" U2 h$ O- _+ Z9 j                                                                       6 S% \5 V: S4 k
          Section contains the following exports for VideoDeCoder.dll  & @* B: M$ W1 _/ `, |* _' F: [5 Z
                                                                       $ N" c! W- E7 ~* P' {9 {2 ]
                   0 characteristics                                   
" Y! d2 a% V8 A9 {            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
$ i8 @4 Q" @1 I                0.00 version                                          
% q' ?5 U' c" B! y                   1 ordinal base                                      0 b. c" O( L( i+ g) f& {4 ]
                  11 number of functions                              
( H$ z, c  e6 K5 ^2 Q. e, c                  11 number of names                                   
2 _) d/ H- B  B3 V* q( z2 r                                                                       
. W, v' I) Q2 C( N6 r            ordinal hint RVA      name                                 . Q0 M4 n) ]4 X) J* N
                                                                       , Y9 N! l+ N# j# |- |
                  1    0 00010F60 _TM_ClearDecoderBuff@4               
/ e: W# ^7 q6 s6 R( t/ W; S                  2    1 00010E80 _TM_CloseDecoder@4                   4 p) j. {9 |2 C, ?" C: p1 ^
                  3    2 00010F00 _TM_DecodePicture@4                  ) s3 d- v$ R( w" v1 N
                  4    3 00010ED0 _TM_DecodePictureHeader@4            
$ Y! F# ~9 M/ L5 A7 K                  5    4 00010FD0 _TM_GetFileEnd@4                     4 h" A- b+ |7 H" j
                  6    5 00011030 _TM_GetUValue@4                     
: l! k- I5 M" N- R9 i+ _$ `* z# l                  7    6 00011060 _TM_GetVValue@4                      ( c2 e" i" t5 w; `9 v
                  8    7 00011000 _TM_GetYValue@4                      5 r8 e2 F$ |& B# H: l
                  9    8 00010E10 _TM_OpenDecoder@8                    
- }7 s& _- t. Q! [6 K                 10    9 00010F30 _TM_ReturnType@4                     
9 I' z% S7 Q) L; N, I/ B                 11    A 00010F90 _TM_SetFileEnd@8                     
. H! [" z$ {8 X* u                                                                       % B" D  I) ~0 j6 F. ^, Y
          Summary                                                      & }: m' E" [: N: p" T5 C; f
                                                                       4 M3 s% ^" N- p# s5 U
                2000 .data                                             
5 e. G0 [, y: U* x1 G                1000 .rdata                                            - ?0 h9 Z  T, Z$ [/ i. L2 d9 ~( M
                1000 .reloc                                            
" A) a/ C; o4 b* }" x; [& n/ E6 x; R               15000 .text                                             
2 N1 s, w4 S: m+ n  按照以下方法整理:7 w; |; `5 R6 f
  1>添加LIB说明
  F7 ~8 u0 M4 _" R9 Z" v1 |5 m# ~   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
* G( X) \) u$ t. v. J) [            DESCRIPTION "VideoDeCoder library"  
( p" y6 e9 N( h( H* R' a" p        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数; W: G! R: H& `$ h9 k
         LIBRARY "VideoDeCoder"3 @3 `) C, {& O6 P% [1 s
   DESCRIPTION "VideoDeCoder library"
1 `; k% d& w+ v- H) T   EXPORTS
  v0 X) k2 r( t8 R            ordinal hint RVA      name                          
' H$ G  s5 ]. k3 l( x# E8 g- j1 s                                                                7 d+ Y; ^' W. L" E& q
                  1    0 00010F60 _TM_ClearDecoderBuff@4            
, M1 W  J- P7 F( ^, m5 z( {8 d                  2    1 00010E80 _TM_CloseDecoder@4            # t- \6 U% U, X0 d6 A# }# Q
                  3    2 00010F00 _TM_DecodePicture@            
5 y# [( b3 @5 E- q6 s                  4    3 00010ED0 _TM_DecodePictureH            : u# }" P- N. u5 ^7 Z9 c$ x
                  5    4 00010FD0 _TM_GetFileEnd@4              . h8 g% R" j/ t, x8 Y
                  6    5 00011030 _TM_GetUValue@4               
( J3 N- u6 v$ s- }% [2 U) R9 U3 k& x6 n                  7    6 00011060 _TM_GetVValue@4               
2 i# J* {. C. ?, z+ Q                  8    7 00011000 _TM_GetYValue@4               
0 Y: f) G& N5 k# L9 l2 J                  9    8 00010E10 _TM_OpenDecoder@8            
, |0 S7 e* }  j& z1 h  h: ?( u                 10    9 00010F30 _TM_ReturnType@4              5 F; Z/ F) |' K5 g
                 11    A 00010F90 _TM_SetFileEnd@8     
8 G- P  n- ~1 `5 n        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
0 ]  T  B) ]& U( [2 z! K        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
: s' X7 \' c+ ]        最后形成.DEF文件如下:
$ g: C* [- u+ j) N& Z5 i- L        LIBRARY "VideoDeCoder"
8 O1 t  m! E8 \$ i: N7 Y3 f  DESCRIPTION "VideoDeCoder library"# u' w+ k, s: A( I- \
  EXPORTS2 o- ]: z% J6 W2 j) \4 ^
      
8 ]3 E, n6 N6 Z5 [" G  TM_ClearDecoderBuff@4             @1    " H; {# j! L7 M8 g9 A9 o
  TM_CloseDecoder@4                 @2   
- D/ y" K3 C" D  ]/ K( {  TM_DecodePicture@4                @3    5 t" Y: Z$ d' M0 u! K9 O
  TM_DecodePictureHeader@4          @4   
' ?$ z- a) r3 A) `# X/ m+ r  TM_GetFileEnd@4                   @5   
8 m4 a. W) K4 O3 J) g; [  TM_GetUValue@4                    @6    & _' W/ B: ^6 B7 G5 F
  TM_GetVValue@4                    @7   
+ b, v7 ]; ~- R( F% V. e  g  TM_GetYValue@4                    @8    0 g/ ~: q4 {; |- x0 L
  TM_OpenDecoder@8                  @9    4 `6 W$ I. b; ?1 _; V
  TM_ReturnType@4                  @10   
, h" F( {8 _" i8 k! N! W2 v$ t5 }  TM_SetFileEnd@8                  @11    1 z8 J* Q6 V" A
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.4 Q( i+ h/ B" D6 |
EXAMPLE:
) {( H3 W% m5 Q9 e  LIB /DEF:VideoDeCoder.def /MACHINE:IX86
" ]2 V7 s3 y  \& K4 B- q4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:, [7 ?  C6 j. y7 Q0 g# q( I! Q
error LNK2002:unresolved external symbol "functionname@nn"
5 A+ `. d6 B' q! T( u# o提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立3 b7 Z/ _5 J: P7 K: F3 D
LIB,重新链接即可./ P6 J9 Q$ @5 y$ c* R
" C0 p4 D; Z2 G" Z/ D) g4 i
这样就制作成功了符合VC调用方式的LIB了!
( O* l% B% d/ ~4 D4 {# e参考:MSDN2000
/ O# B. ^& d- d- {, b要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
4 ]6 b7 R5 y8 u# F, f% _IMPDEF xxx.def xxx.dll; Z; w/ n: x4 n
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
3 a2 T. M  h6 Z( v" C; a而在C++BUILDER中!
/ W9 a, M9 R* c1 E0 T: z__cdecl的函数输出前会带一"_"  N3 C/ v& c4 j7 n7 n
__stdcall无特征,只输出函数名3 v$ q5 D" f, Y$ {6 B
__fastcall函数输出前带一"@"
/ W7 S  l/ ~) ^& X( |都无"@nn"后缀格式!1 J0 V6 n' \+ `: v2 g
在VC中!* |4 }" h9 b2 T1 t5 H
__cdecl无特征,只输出函数名
3 W/ ^5 ?" |$ p: R* z# M  U__stdcall的函数输出前会带一"_"后缀带"@nn"2 M; a; U, Q5 U7 F4 `; m+ }
__fastcall函数输出前带一"@"后缀带"@nn7 T6 l5 @* o/ h! e3 [: c
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 02:06 , Processed in 0.022824 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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