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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!8 }1 m# x3 w$ x; @( A

/ x6 ?7 ]* W3 V1 l$ q1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
' C' G% a/ m1 R EXAMPLE:7 j6 o/ l; g3 E5 A- R. @5 U' y
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def. c5 R1 h" O+ D5 ?, c0 I9 m
$ R5 i' a$ k) A; s! D/ ?: t% e
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
+ o* F9 G/ {9 U& i4 ] EXAMPLE:
( \7 V) o) P* [- K" p( e3 F8 i  VideoDeCoder.DEF 文件内容如下$ n/ ]1 j+ Y1 [
                                                                 
$ F0 F  b, B# c* X1 _: h7 }        Dump of file VideoDeCoder.dll                                 
+ p0 ?% m0 A& C! m( _                                                                       ' ~" `' g7 ]1 ?& x+ b- N6 \$ c- A
        File Type: DLL                                                 9 d6 L( W0 c* D7 L$ h5 b1 C; v% N
                                                                       * c) a, Q; N  z( a' U
          Section contains the following exports for VideoDeCoder.dll  
- v* S* j# ?* @* a                                                                       / A* }& }! z" @4 t% q1 J, }  n0 V1 u
                   0 characteristics                                   $ r$ D- q, p' y' f! r* E3 L4 n
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          " {  ^. V4 C( F" ]' c
                0.00 version                                           ; m6 ~; O& |2 Y7 i' h- c
                   1 ordinal base                                      8 V" S$ v9 D" {$ g9 l  P5 `$ f2 w
                  11 number of functions                               7 O% C+ K" D9 a9 f7 z+ W9 B" p: e
                  11 number of names                                   ' `! q! t% I0 E
                                                                       
0 A% Y0 v5 |  i. Z            ordinal hint RVA      name                                 7 s* E6 |$ Z% w5 g- |  v6 g8 x# ^
                                                                       ; }0 t* r$ h6 ~' W  P; j) p
                  1    0 00010F60 _TM_ClearDecoderBuff@4               
$ B) J4 z2 l. {6 J' n& O* z, l9 @' a                  2    1 00010E80 _TM_CloseDecoder@4                  
4 M/ @' Y6 j  M6 `! E  w                  3    2 00010F00 _TM_DecodePicture@4                  
' J6 n. q  y$ }+ D5 }7 O( ~  M: |$ m                  4    3 00010ED0 _TM_DecodePictureHeader@4            # a, E+ c5 ~9 r- e
                  5    4 00010FD0 _TM_GetFileEnd@4                     . t8 h" h: W( Z9 C
                  6    5 00011030 _TM_GetUValue@4                      2 K/ F7 r( b! p4 D+ X! _
                  7    6 00011060 _TM_GetVValue@4                      ' |# `% U! b. e( I, A, b2 P1 n/ C# R
                  8    7 00011000 _TM_GetYValue@4                      2 _7 h  r  j4 g( Y+ H. G
                  9    8 00010E10 _TM_OpenDecoder@8                    " e8 F! n+ h! B" c( m+ B6 G7 s1 B
                 10    9 00010F30 _TM_ReturnType@4                     & q$ K( V0 W* x, d# T6 y5 g
                 11    A 00010F90 _TM_SetFileEnd@8                     
3 A. E4 R( a" m                                                                       ' t) b  ]0 m% C; u! a
          Summary                                                      
2 F! U0 R$ U8 F                                                                       ( B( E- f; V$ E$ z
                2000 .data                                             
5 q* G# C4 U. T. {- b( D                1000 .rdata                                            - S. _; [  }2 C- Y. d" w
                1000 .reloc                                            1 U& d( ^3 W7 [" m0 ~7 o2 f
               15000 .text                                             * J) L$ l: h: n  r
  按照以下方法整理:5 @2 m" ~) i" x# |4 j
  1>添加LIB说明4 d6 q# i7 g- R; d  d! U! `' a; @
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
/ e4 A. i/ R# K8 X6 C$ ~+ f            DESCRIPTION "VideoDeCoder library"  9 A' h+ g) b" v6 Z% b
        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
5 s8 ?* g( A5 l1 ]: ^         LIBRARY "VideoDeCoder"
# J7 o4 |+ y9 i7 [* ?! d   DESCRIPTION "VideoDeCoder library"% m& [& p* K: _5 X
   EXPORTS
0 u' y( Y$ Y1 u; s* ]7 Y  N            ordinal hint RVA      name                          
) E- a1 k, q$ W3 u* Z9 E) Z                                                                1 A7 @; u( |  q
                  1    0 00010F60 _TM_ClearDecoderBuff@4            & d! E1 H$ P0 X! B
                  2    1 00010E80 _TM_CloseDecoder@4            ) v0 I% o" L# a& V) R6 S
                  3    2 00010F00 _TM_DecodePicture@            : C0 ?. j- z( d: _
                  4    3 00010ED0 _TM_DecodePictureH            
  T( T7 }% Z" ]) s6 S: ^                  5    4 00010FD0 _TM_GetFileEnd@4              
# k' t/ ?. S4 K7 v/ V                  6    5 00011030 _TM_GetUValue@4               0 `' B3 `$ {; y" g
                  7    6 00011060 _TM_GetVValue@4                 m* L! ^. j3 z3 p5 D0 u
                  8    7 00011000 _TM_GetYValue@4               ' Z9 D1 D8 f) f4 P, k/ k
                  9    8 00010E10 _TM_OpenDecoder@8            
5 x- x" q, x- j7 G                 10    9 00010F30 _TM_ReturnType@4              
, {6 M3 P- R1 p/ M) u) j, x                 11    A 00010F90 _TM_SetFileEnd@8     ! f7 _( n* K# b0 P6 l) y" m
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
# l# c; l. `9 P# C& m7 t& K        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
& ~+ {, }. n3 O( ^        最后形成.DEF文件如下:  Y4 b. Z8 z$ I$ c( {
        LIBRARY "VideoDeCoder"
' g/ M7 I$ k/ {: _* B  DESCRIPTION "VideoDeCoder library"7 D2 p1 ^1 C% e
  EXPORTS
8 _! W( A5 j9 s1 @9 D' F      - v. Y3 U4 S5 S
  TM_ClearDecoderBuff@4             @1    % X1 Q' |0 T* S/ c6 F7 w% O& X- m1 S
  TM_CloseDecoder@4                 @2   
) B- @( m. y4 \, f, _# G- l  TM_DecodePicture@4                @3   
7 z# \+ H# k) z+ O2 J' P. a  TM_DecodePictureHeader@4          @4    ! c# e% }, Y# P5 S3 n$ R( e8 }
  TM_GetFileEnd@4                   @5   
$ `6 W& [6 J  R, D) {: K9 q3 w4 X6 B  TM_GetUValue@4                    @6   
* d8 Y/ i: j/ j  TM_GetVValue@4                    @7   
' h2 p2 ~/ c5 O) B  TM_GetYValue@4                    @8   
9 j0 \4 C6 ]+ `+ N  TM_OpenDecoder@8                  @9    7 H8 E+ \. x: |3 }! c
  TM_ReturnType@4                  @10   
; [' U& L7 U( g! ?# \% l4 |, @8 P  TM_SetFileEnd@8                  @11   
& g8 V$ W; B% V. J3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
' {" l2 o- P/ Z1 U! l. j( W8 b EXAMPLE:
. L* P4 X0 z: N5 b* A' B9 J: L  LIB /DEF:VideoDeCoder.def /MACHINE:IX86
# ~' c9 z; m8 T- q$ r) z3 d4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:! T  j3 L  T- R. t4 q7 L( c3 f
error LNK2002:unresolved external symbol "functionname@nn"
  b" d/ w' g8 D7 y提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立  ^, d. K4 {7 g: p
LIB,重新链接即可.0 q+ P' c) V, E6 Z/ `! q
+ H$ X$ O1 M( O" G# P
这样就制作成功了符合VC调用方式的LIB了!
7 w: T9 e" U- f$ r& \2 h参考:MSDN2000  D# u0 H: K8 s# q; W7 h
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!, X% l: l4 Q8 `$ b2 b$ ]3 e
IMPDEF xxx.def xxx.dll8 I* Y4 _, `  _. e7 m
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:) f2 Y0 L# U7 a2 |% Z" e
而在C++BUILDER中!7 z/ m2 M% x4 g
__cdecl的函数输出前会带一"_"
' _, F1 s& R0 C1 \; O( N__stdcall无特征,只输出函数名
) @: d5 A" M5 K! n2 O) ?9 N: d__fastcall函数输出前带一"@"
  d. ?% T2 `4 w7 a都无"@nn"后缀格式!! g+ }7 Y5 q4 }! w2 f
在VC中!4 |) n" p) P$ i% q3 [5 @, W
__cdecl无特征,只输出函数名6 ]6 j: W  c: Y9 U) s/ `
__stdcall的函数输出前会带一"_"后缀带"@nn"
+ r! L& J% L4 w9 b" I# s. U# n__fastcall函数输出前带一"@"后缀带"@nn( w; n( ~7 _$ |
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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