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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
6 r: b8 h/ o; n' i3 F2 \$ j* x0 t& @: S* N
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
! X. _6 Y  O; a# s- o EXAMPLE:
. z% N- K; u  j; K8 V5 Q9 I  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def0 O+ e( _6 f1 p- N/ w

# {) s0 A7 b2 V/ Z% V) `2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件- X1 H2 K, x2 g* s
EXAMPLE:
. _# n! p) O9 ]8 }4 N7 X3 c  VideoDeCoder.DEF 文件内容如下
* e; q/ q) O, N) h5 s8 A                                                                 
0 e$ o5 Q. F" c* w) G# |7 b        Dump of file VideoDeCoder.dll                                 
; C6 C1 i2 `% r9 ^                                                                       # Y& u2 G* e* A- E# W) d( Q
        File Type: DLL                                                 ) s1 B' P8 p) w+ u3 D* ?7 b* S1 F. \
                                                                       
7 z' {1 _' x: Z( u$ F9 n          Section contains the following exports for VideoDeCoder.dll  
4 ~" F* _- T% M  H6 F% Y7 H                                                                       6 z$ s$ n1 u: T
                   0 characteristics                                   
0 a4 O- K$ k7 H            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          ' [; z5 k5 Z; b
                0.00 version                                          
. I4 m  Q5 T7 ?' H+ y& A                   1 ordinal base                                      
) V7 m+ o9 _: L- U' \+ z                  11 number of functions                               * P  X, q4 I+ E0 w2 t% ^+ z
                  11 number of names                                   
( t2 @  X) F6 m* l5 h6 U7 ^$ C                                                                       
; s1 o+ L1 x; ]            ordinal hint RVA      name                                 
/ @8 d8 ]1 e( |$ G% I1 M                                                                       
1 W" V- ~) O, R9 D                  1    0 00010F60 _TM_ClearDecoderBuff@4               
4 _) S+ N: _2 l- O( D+ F6 @- Q                  2    1 00010E80 _TM_CloseDecoder@4                  
- C* T9 r* B+ Q3 X& x                  3    2 00010F00 _TM_DecodePicture@4                  - V8 }/ h  ?* B
                  4    3 00010ED0 _TM_DecodePictureHeader@4            8 r" ?/ d3 D5 t& A6 k0 v
                  5    4 00010FD0 _TM_GetFileEnd@4                     
, w0 K: a, D9 K( P                  6    5 00011030 _TM_GetUValue@4                      + ]2 R! e3 f+ G+ t7 l8 K
                  7    6 00011060 _TM_GetVValue@4                     
2 E1 A0 F9 X2 f4 P; F- P& n3 f                  8    7 00011000 _TM_GetYValue@4                      + v- _! z( K! M$ M! D) Y; R1 w+ q
                  9    8 00010E10 _TM_OpenDecoder@8                    8 r/ x4 V  J# N, G3 v+ @+ p
                 10    9 00010F30 _TM_ReturnType@4                     
# Q9 W# Q9 ^( V3 B                 11    A 00010F90 _TM_SetFileEnd@8                     
4 A1 H4 B) q/ X% s9 X                                                                       6 _. E/ V' J9 {/ R
          Summary                                                      
  e5 I. h1 p% Q$ Y, h                                                                       
# V! Q$ Z; y9 p) X) D* S8 X6 W4 ^                2000 .data                                             . u( b/ \7 U9 Y; T
                1000 .rdata                                            ) Z3 s& O# ~$ @$ n8 G3 Z( F- d4 I
                1000 .reloc                                            3 f9 ~3 f% G  E- C8 A1 f
               15000 .text                                             
; D( ]9 I: B) C) w  按照以下方法整理:3 K# L- T9 k9 I7 B, I5 M
  1>添加LIB说明
% M0 Y+ u2 j. W. b- d7 _" n, g   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称0 L, M2 r9 n8 ?( t! [
            DESCRIPTION "VideoDeCoder library"  
7 T! ]& `% s6 x        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
1 m4 P2 |, T4 b+ S- d  i' {* P! g         LIBRARY "VideoDeCoder"
5 d' [, D+ g/ i* K' Z7 z   DESCRIPTION "VideoDeCoder library"
4 g; E! ~: H* ^+ f' L7 C+ m( a   EXPORTS% l) \. h4 f* B
            ordinal hint RVA      name                          
4 b9 J; e  o  g( `5 l                                                               
. G* {/ @0 o% R& U* x0 @" {( n; f4 O                  1    0 00010F60 _TM_ClearDecoderBuff@4            ( ]' Y) _' q2 n9 i
                  2    1 00010E80 _TM_CloseDecoder@4            
5 g2 j! \! p. s; ~                  3    2 00010F00 _TM_DecodePicture@            # E2 u2 G& q: A# ?# |
                  4    3 00010ED0 _TM_DecodePictureH            $ R. [2 O- G, h* ^
                  5    4 00010FD0 _TM_GetFileEnd@4              " d+ h+ [* y. Q' k2 C$ z
                  6    5 00011030 _TM_GetUValue@4               ( {7 h$ Q4 ]2 H7 e
                  7    6 00011060 _TM_GetVValue@4               
& Y+ \5 o3 P$ t                  8    7 00011000 _TM_GetYValue@4               0 K5 \/ o( a6 G- \* T3 N: }
                  9    8 00010E10 _TM_OpenDecoder@8            
" j% G- w7 R- R: y                 10    9 00010F30 _TM_ReturnType@4              & ?, l5 r0 _: b& {
                 11    A 00010F90 _TM_SetFileEnd@8     - [9 L& u' X9 x
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
( w% f7 B3 u! c( y2 Y9 Y        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
% M1 @! n7 x0 Q. J, u8 P! b$ d        最后形成.DEF文件如下:* |) f$ h, i6 n& p* l5 J" t
        LIBRARY "VideoDeCoder"
* T' V' D4 \( h9 Z3 W  DESCRIPTION "VideoDeCoder library"
: @% z; @4 ], O. `  EXPORTS. D; X6 {5 R0 a8 [5 e
      
- `, W' e0 A% m7 |- F" X; R  TM_ClearDecoderBuff@4             @1    . T% ^' t/ ]& L/ |8 k, S; p
  TM_CloseDecoder@4                 @2   
2 d, P8 V+ h. k$ n' q) G/ C  TM_DecodePicture@4                @3   
# X  I1 k& \7 s4 Y/ [8 Z  TM_DecodePictureHeader@4          @4    5 B' a: N" w6 ?
  TM_GetFileEnd@4                   @5   
4 [$ k5 n* D4 e$ T9 r  TM_GetUValue@4                    @6    - ~% l+ B5 t7 g5 P
  TM_GetVValue@4                    @7    7 G: [  _" J2 q& X1 o" u5 x
  TM_GetYValue@4                    @8    2 r% k+ \; i4 J
  TM_OpenDecoder@8                  @9    2 R% `. b% ^3 h, _; w
  TM_ReturnType@4                  @10   
2 G# B) I4 r- N$ v+ {6 H7 U  TM_SetFileEnd@8                  @11   
# m& K* D: Q; K/ O" W, E3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
. p7 \5 a. z. X  m* B! ^6 \; B+ P8 G EXAMPLE:
1 `% _( P1 u# n0 [6 N  LIB /DEF:VideoDeCoder.def /MACHINE:IX864 b8 ~5 w8 G7 I6 P9 f$ a
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:+ I4 {+ ?; @4 W! t3 |& ?
error LNK2002:unresolved external symbol "functionname@nn"$ p1 r# R* P" _# h* m
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
" s$ q  t1 D% ~; I' PLIB,重新链接即可.+ j- X- O; N2 Q6 k) m+ _4 o
5 U" H" c3 J0 t+ p* h2 ~6 [- d5 A
这样就制作成功了符合VC调用方式的LIB了!  L& g3 u/ E5 I" l
参考:MSDN2000/ \; c1 {8 ]: L; C1 U- @
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
$ d/ ?& ^  U* O/ g+ ?& }IMPDEF xxx.def xxx.dll. V5 J* U9 o1 V- ?3 @2 C
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:8 L8 U4 i* u( q5 V2 N/ O
而在C++BUILDER中!6 E( `* x* v3 h  h
__cdecl的函数输出前会带一"_"9 A0 }) |* Z7 R$ `* s
__stdcall无特征,只输出函数名9 L# L5 t9 T, C" J
__fastcall函数输出前带一"@"2 ?( D5 w( p% R, s
都无"@nn"后缀格式!
$ E/ Y! y; b% n2 I2 c在VC中!# j8 J9 q$ @+ u! r9 z1 L, z
__cdecl无特征,只输出函数名  M+ q) d% \8 h( e% A, W1 m
__stdcall的函数输出前会带一"_"后缀带"@nn": |3 Y' x/ t9 ]4 v1 f
__fastcall函数输出前带一"@"后缀带"@nn
- B# `# P2 F1 d) n* ]2 @* R只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 11:49 , Processed in 0.018692 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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