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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!% m5 w& y+ X4 r3 w8 P

& s' _. A( q8 }) J3 H1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
6 e9 v  f) }. q4 n' P3 I! o EXAMPLE:
+ {& v8 h5 X0 N9 T. T! D+ t  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def$ F! \5 {2 X( W4 S3 ^: o) ^
! V' f; v! y4 d& z4 y' a7 b( ?
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件0 G. y4 z& r1 n- J2 B0 u! o$ L' z
EXAMPLE:
1 x  w# H) H4 Z  VideoDeCoder.DEF 文件内容如下: e0 U8 c# Q+ W. ~: ?7 `" a! c
                                                                 ) {8 d- a5 e& F, P) s
        Dump of file VideoDeCoder.dll                                 
) q: f8 z9 Z/ L5 b                                                                       
- m( d. v: \* j        File Type: DLL                                                
% D2 |: \7 k* W) ?5 J' v                                                                       
% Z" F3 d8 s+ R$ C; Z; |- t# e: n          Section contains the following exports for VideoDeCoder.dll  8 ^; z/ r* a, R& V$ j% w& K
                                                                       - C$ N1 c. c/ T' n$ u3 v6 L4 {
                   0 characteristics                                   
/ ]  P$ P1 c: Z* c8 j/ p) L            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          : B1 Y  r- W- k+ {) U, N
                0.00 version                                          
. N9 k# L3 k( m1 X) f9 ~! g7 I/ [                   1 ordinal base                                      6 E+ b0 ~9 O0 r3 M3 B1 W
                  11 number of functions                                 T- }( G" ]4 S* t8 e* a
                  11 number of names                                   ! ]$ i: i) ~9 e) L8 G( h
                                                                       
; s6 u; T# C, b            ordinal hint RVA      name                                 
$ Y! k* }1 k' ~: q6 A! q+ U2 f0 l( a                                                                       5 B: O) b2 g: A& V- Z' ^, F
                  1    0 00010F60 _TM_ClearDecoderBuff@4               * y9 [4 @1 g5 D4 E& y* m
                  2    1 00010E80 _TM_CloseDecoder@4                   5 @% @0 a1 A! C1 u1 w
                  3    2 00010F00 _TM_DecodePicture@4                  
- p( `, {6 k0 K- m* \  }                  4    3 00010ED0 _TM_DecodePictureHeader@4            8 e# k9 n2 V2 b) p" g1 Z
                  5    4 00010FD0 _TM_GetFileEnd@4                     & G7 t1 C  O4 A: r
                  6    5 00011030 _TM_GetUValue@4                     
$ j/ ?; _9 {( G+ e% i7 i( z                  7    6 00011060 _TM_GetVValue@4                      * P* F* Z3 E- |; Z
                  8    7 00011000 _TM_GetYValue@4                     
& o8 h  i6 @" s( q( x$ y                  9    8 00010E10 _TM_OpenDecoder@8                    & W5 {; f3 y0 U* L
                 10    9 00010F30 _TM_ReturnType@4                     
% t( `; L. d* b. H                 11    A 00010F90 _TM_SetFileEnd@8                     ( W! F8 e% e! T% P
                                                                       & }" b1 k$ X  {' Q" n
          Summary                                                      # J- z! Z3 D* H/ f/ S, l4 V
                                                                       
7 Z8 G3 Y% U8 T! Q+ e) V                2000 .data                                               p! ]# L, E' A2 |1 s( r
                1000 .rdata                                            " [5 J0 T: K9 b% g" P4 |
                1000 .reloc                                            
8 M/ {; ]- i4 p: v* a" Q               15000 .text                                             5 k0 O; S' f9 i- E. e
  按照以下方法整理:
. o+ i  D* L" @5 _6 n  1>添加LIB说明# ?% I2 e1 F# G- j; H6 m9 \
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
8 l3 P4 p9 h+ x% \4 n& h            DESCRIPTION "VideoDeCoder library"  
8 _' {0 }; _6 J8 z7 A+ B        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
% U) C) M7 K& ?; l         LIBRARY "VideoDeCoder"
1 P; P1 f5 K9 ^   DESCRIPTION "VideoDeCoder library"5 v# q! W- G& A& B
   EXPORTS( i9 M' Q# l- @  P* g8 N0 F* O
            ordinal hint RVA      name                          ; S+ f1 S# e7 }9 [$ ~: o$ b
                                                                % G- l& G! x* S1 L3 t- b
                  1    0 00010F60 _TM_ClearDecoderBuff@4            
6 i/ O: m6 ?3 ]6 _3 z5 Z0 M' y, V* z                  2    1 00010E80 _TM_CloseDecoder@4            
0 K) Y1 K8 O2 f8 M                  3    2 00010F00 _TM_DecodePicture@            
& _1 r& `  o: ~  A1 Z- K# c' i                  4    3 00010ED0 _TM_DecodePictureH            * o5 I3 z. Q) f
                  5    4 00010FD0 _TM_GetFileEnd@4              - F1 I2 n. j% j$ c, h8 U
                  6    5 00011030 _TM_GetUValue@4               3 j+ k/ `7 F. [+ j. g7 d
                  7    6 00011060 _TM_GetVValue@4               , y3 M. X4 Y$ y
                  8    7 00011000 _TM_GetYValue@4               6 B2 N7 _- S  d+ n$ J
                  9    8 00010E10 _TM_OpenDecoder@8             0 B# h' c# i5 G7 Y+ b
                 10    9 00010F30 _TM_ReturnType@4              ) Q" N4 b3 I2 F
                 11    A 00010F90 _TM_SetFileEnd@8     2 ~- A2 \) B) j% E$ w
        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
1 R) o4 T) ?1 U" _7 |, b        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
9 k$ L5 t8 I, S7 r7 w        最后形成.DEF文件如下:$ Q( T! M! T2 o7 Q
        LIBRARY "VideoDeCoder"
0 I* o4 F1 I8 s7 ?  DESCRIPTION "VideoDeCoder library"9 p0 e" j4 I( b9 n. C+ R1 `
  EXPORTS) j0 X+ [6 T0 S! }7 F  F
      
; ~  \% h. Q" Q1 h: H  TM_ClearDecoderBuff@4             @1    : [5 D9 |* F) N4 X
  TM_CloseDecoder@4                 @2   
+ Z- i  d* u# `  TM_DecodePicture@4                @3   
8 A- h3 L3 i  a2 t3 @" m- m  TM_DecodePictureHeader@4          @4    7 V  @7 q$ Y$ H8 ^0 r! b1 v
  TM_GetFileEnd@4                   @5   
! y" ]/ r2 X5 m  TM_GetUValue@4                    @6   
! p. b  \$ ^5 S+ u5 G# N" }  TM_GetVValue@4                    @7   
: [/ |1 k+ I" S- o, |; I3 P  TM_GetYValue@4                    @8   
4 ]9 o" d# {0 _; N4 K! l, U  TM_OpenDecoder@8                  @9    # P8 E( h! F1 n$ F* U
  TM_ReturnType@4                  @10    ; G, l/ M  G! x4 w! J
  TM_SetFileEnd@8                  @11    5 w5 V! j* l( ?, ^/ i1 {
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
1 J/ Y' S5 \# D$ i5 E( a EXAMPLE:- ^& P  I) O& \) N4 F. X
  LIB /DEF:VideoDeCoder.def /MACHINE:IX862 t1 p  h- Z5 U- n/ y# @
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:9 d+ B$ Z6 b# W" T9 w1 E) A; U( c$ @
error LNK2002:unresolved external symbol "functionname@nn"
9 y" Q0 Z: V; z. T' z提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
5 x4 K! Y# ]( M4 d( p' ]# j- QLIB,重新链接即可.* C7 J" L; U% Q; u& O: H
/ M! [" `8 T0 s* Q  K; T8 D
这样就制作成功了符合VC调用方式的LIB了!
( L( y5 r, J( Z: h4 Y, B! G, D参考:MSDN20008 }. G- ~+ q1 ^- E' r% M
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!$ t) B) s7 |9 d( d; M7 s
IMPDEF xxx.def xxx.dll! v* Z9 O, E* M* l
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:$ ?$ }* B; }- c5 _
而在C++BUILDER中!
/ J' _9 ^0 S; t' W__cdecl的函数输出前会带一"_"7 M6 t9 n/ f3 N9 q2 L, c
__stdcall无特征,只输出函数名
, ~/ M5 j9 a' V' i__fastcall函数输出前带一"@"1 Q4 f' h, X/ b  g2 R
都无"@nn"后缀格式!! U3 i8 R6 V' Q4 L8 |. l0 y
在VC中!1 X5 A  [" m3 H) s# F4 c0 y( B8 V3 U
__cdecl无特征,只输出函数名
+ P3 p) E7 H: Z' f' w. T__stdcall的函数输出前会带一"_"后缀带"@nn"
# o0 ?% ?6 H+ S7 v" j, K__fastcall函数输出前带一"@"后缀带"@nn# I9 B5 a+ i, ~: k- t, E
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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