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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!$ [3 m, R9 X9 z' e4 O
( ]; t' O( @: ?; e
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
( T5 i; A; k! @( s' x EXAMPLE:
) K7 F$ Q' [. r# n  B  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
! W; h6 K+ _2 x
/ |7 f# o* [$ P* ~  n% c2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
5 D8 N: ~  Q" r* ?& Y/ Q" K) h EXAMPLE:* g( G. O- o+ \- ^1 C) O8 p
  VideoDeCoder.DEF 文件内容如下
# f/ S" @9 B6 A$ r% ~( g( o                                                                 
; _& N) I/ [" ]$ j6 ^        Dump of file VideoDeCoder.dll                                  3 m4 C9 [0 x5 n: s) m" Y/ C
                                                                       
& x; @1 b( f0 v. ?6 o5 F        File Type: DLL                                                 ) n" {. x% J, q
                                                                       
, ]( D2 e& B/ B- o. t6 @, W          Section contains the following exports for VideoDeCoder.dll  
1 d" q9 _8 J1 c# g( D. m                                                                       
+ P# z7 ~# `4 G( A# U                   0 characteristics                                   
  d, C- ^" x* h' M( r            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
% C+ [+ I) a, g% K. h3 ~+ O                0.00 version                                           4 p, y, k: c: H% q- B: _: n( r
                   1 ordinal base                                      : U/ F% T: |0 K3 t% H
                  11 number of functions                              
0 w6 E" O* {; ^8 _5 M                  11 number of names                                   
% F+ j; ?6 D: O. ^5 S. \( U  v                                                                       6 U1 m6 l. h, O+ @! p/ f4 O
            ordinal hint RVA      name                                 8 `$ q6 s5 l" @1 Z# {
                                                                       
4 U9 w7 p/ d( c! D                  1    0 00010F60 _TM_ClearDecoderBuff@4               
, B' T4 `; ^" M, n; b/ m                  2    1 00010E80 _TM_CloseDecoder@4                   ( O5 _0 }; s! c) U: y5 V* K
                  3    2 00010F00 _TM_DecodePicture@4                  
# v% Q% _) s# _                  4    3 00010ED0 _TM_DecodePictureHeader@4              T& {# k: c7 ~5 W, g9 i' M7 E: Q
                  5    4 00010FD0 _TM_GetFileEnd@4                     . q, H) e5 V& S- w7 |
                  6    5 00011030 _TM_GetUValue@4                     
+ d  M) S% m9 }4 L" z( h. @                  7    6 00011060 _TM_GetVValue@4                      ( X: H6 ]4 E$ _9 L
                  8    7 00011000 _TM_GetYValue@4                     
1 S  \4 B1 U. F7 N5 G& I                  9    8 00010E10 _TM_OpenDecoder@8                    & V* ~6 d, q! ]7 K2 Q9 C7 F; p
                 10    9 00010F30 _TM_ReturnType@4                     
9 z/ k' C+ s2 m, o+ t! |! a4 [) K                 11    A 00010F90 _TM_SetFileEnd@8                     
0 F) ~7 ]3 Q0 q7 C                                                                       
% n$ m0 {# _3 h3 T) u* O          Summary                                                      ' d# @  [* K; K+ \
                                                                       
8 T+ O, M/ @' @, T                2000 .data                                             
5 ]( [, [6 Y9 t6 b) n% r- d4 g                1000 .rdata                                            
' u- [8 \) J5 s) ]                1000 .reloc                                            
8 M7 m4 h. }4 M# n               15000 .text                                             % ?1 M0 g$ a# n: h# I) N7 @
  按照以下方法整理:
3 P& E1 P) _4 n* R  1>添加LIB说明+ B3 P: J6 X# b8 _+ ~# W
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称, H- U2 S0 i. b3 y' M- E  n
            DESCRIPTION "VideoDeCoder library"  0 J* p! k( }" |$ S7 C$ a
        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
' w9 a4 o' J  P  T5 L# g         LIBRARY "VideoDeCoder"
' U5 U7 J5 s+ j9 ]   DESCRIPTION "VideoDeCoder library"  ?2 Q3 ]" ?$ e, O7 y
   EXPORTS
& u2 ^+ L1 t, N+ @6 I+ k            ordinal hint RVA      name                          $ x) n& w, K: W
                                                                8 l  ]* r) c" h: i
                  1    0 00010F60 _TM_ClearDecoderBuff@4            
  d8 K# p3 p& K! ^+ r' C                  2    1 00010E80 _TM_CloseDecoder@4            ' d" ^5 b+ S$ b3 G
                  3    2 00010F00 _TM_DecodePicture@            
, ]* t* z# `, P; k: X8 _3 |                  4    3 00010ED0 _TM_DecodePictureH            
# M( V/ |! R! K                  5    4 00010FD0 _TM_GetFileEnd@4              ( D, v- O' w, D" X1 d: c
                  6    5 00011030 _TM_GetUValue@4               2 t- D0 K0 p- L2 S! i
                  7    6 00011060 _TM_GetVValue@4               
/ R  W' T4 X9 H7 L( q                  8    7 00011000 _TM_GetYValue@4               1 D$ M1 i! w) R8 i1 f
                  9    8 00010E10 _TM_OpenDecoder@8            
* k/ c. N+ [9 s: l1 {- q" `! F8 z                 10    9 00010F30 _TM_ReturnType@4              
4 R5 K% U( y  j5 f; {& v                 11    A 00010F90 _TM_SetFileEnd@8     
+ z3 k, ^/ Z/ r1 O4 @        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
' c/ Y( x. W' V, ?7 w9 L        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").8 C8 j2 i5 S8 |% Q
        最后形成.DEF文件如下:
! }6 F9 a" z, d8 s$ ]9 h        LIBRARY "VideoDeCoder"% {; v) h: }$ t% h4 d
  DESCRIPTION "VideoDeCoder library"
( `- ?4 g1 A3 N) [4 M  EXPORTS
) o# W* P' T& D' B& I. L+ B. s      / n0 y% s# Z$ i: Y
  TM_ClearDecoderBuff@4             @1   
# O# @9 L& q; C. U+ }1 j6 ^  TM_CloseDecoder@4                 @2   
- b6 c8 |2 C. B6 z0 q7 e& K- P  TM_DecodePicture@4                @3   
0 |! u! e: v5 F3 L9 O/ E# w. r  TM_DecodePictureHeader@4          @4   
# D# h1 |) U, w! D6 L# p0 ?  TM_GetFileEnd@4                   @5   
1 u9 \3 R6 N8 ], ]  TM_GetUValue@4                    @6   
8 [1 ~# {7 k1 A+ G3 P; k  TM_GetVValue@4                    @7    * b# D: E3 U5 n2 g7 o. Y
  TM_GetYValue@4                    @8   
5 K; a) m7 E( Z: P! Y: L  TM_OpenDecoder@8                  @9    , {! e  J0 X9 E' y$ {1 v
  TM_ReturnType@4                  @10   
5 U8 W- G0 i# I# ?+ q' n5 Q1 \  TM_SetFileEnd@8                  @11    - g' d- _& `( O
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
. D$ b2 i/ G: s- U* ]3 ? EXAMPLE:: U7 ]+ M% b% k2 g2 P
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86* _: v6 e; L" {
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
& r0 }& k8 c) V& O error LNK2002:unresolved external symbol "functionname@nn"
! W: ^! u9 v: ]6 B# n# O提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
1 t5 S( f+ ~4 d2 \4 O7 J2 u6 U5 u. yLIB,重新链接即可.
2 f7 t) m. q' {/ k$ C, w$ a
/ T) f  \3 Z* S) u) v; E7 F$ S这样就制作成功了符合VC调用方式的LIB了!1 D1 y3 q, g* w8 \& s9 \! P
参考:MSDN2000
) o& w3 h  U2 R; |要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
3 n; q2 c& K9 u0 Z) c# [6 zIMPDEF xxx.def xxx.dll
  o! [, f0 M* a% b: U, b这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
9 y* V4 _7 C5 }  U' }3 M而在C++BUILDER中!, Q3 W, E; z1 m
__cdecl的函数输出前会带一"_"* |7 d" C+ x2 _! }& X" I( n
__stdcall无特征,只输出函数名
3 S' ]) h$ \1 g# z/ F9 H__fastcall函数输出前带一"@") _# t: r) n- j; C1 j3 a
都无"@nn"后缀格式!
" Q4 d7 d, S4 ]% Z2 I$ z在VC中!8 X! _& g, U" J
__cdecl无特征,只输出函数名* u, t4 x# q2 |3 b/ z7 Y
__stdcall的函数输出前会带一"_"后缀带"@nn"
! ~# M9 S/ Q, Q7 l* n__fastcall函数输出前带一"@"后缀带"@nn4 E* M9 V, V2 ?) R) |
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:12 , Processed in 0.017941 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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