|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
' J' P$ x+ L D4 o, }- V, u
3 [% w5 S. G" U: ?/ z6 w& \9 p1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件" R; N2 n1 D$ N, C& E/ e
EXAMPLE:( y5 A/ [5 k! k1 k6 h* ]
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
5 W8 Y: u7 \ O3 r, S# }) {
J$ j/ U1 ^ ~$ B M9 V3 u2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
' |6 _% ^- ~3 S8 V' }3 {" j/ v0 M EXAMPLE:
8 c7 M2 E) y5 H r% y# Q* j VideoDeCoder.DEF 文件内容如下
1 Z5 |- X) Z1 x4 x% K% j4 Y , ~8 E! r! A5 \8 k
Dump of file VideoDeCoder.dll
* E3 @" F! e8 M/ w# A/ M 8 n/ Q- i! v# d
File Type: DLL
) S. l9 F$ H) F% N1 o8 t * }8 w- d4 @! L, V" C
Section contains the following exports for VideoDeCoder.dll 5 c$ v% ?4 H6 @' b# H3 J
' `; R* m* o# T0 J) w; ^ 0 characteristics
. L) Y8 q! I, ` B5 ^! c& p# b 3D49E48F time date stamp Fri Aug 02 09:46:55 2002 ! ` g8 R' t5 {
0.00 version
, W& Q) o, \( w4 M 1 ordinal base $ r/ f+ ^+ C# u' D; S4 z
11 number of functions & D% G' M) x; Q; j, Q1 @: I9 |% |& T
11 number of names
9 m6 N) T/ n0 t9 E
) E4 f, b) B/ C% ~ ordinal hint RVA name
$ o9 s' f- J) G4 Z8 ~/ a0 _) a 1 Q/ S! G0 e) \! d: t
1 0 00010F60 _TM_ClearDecoderBuff@4 8 q0 b3 c; R) |8 d! G
2 1 00010E80 _TM_CloseDecoder@4 7 j) y0 I ^" ^; B' E, z8 z
3 2 00010F00 _TM_DecodePicture@4
4 T; j) e3 E% k+ }9 ^! d( y) i1 d 4 3 00010ED0 _TM_DecodePictureHeader@4
9 p; D( a+ d3 n 5 4 00010FD0 _TM_GetFileEnd@4 ( u: A1 I( P4 k# E7 v" b. F
6 5 00011030 _TM_GetUValue@4
: Y' a3 |. |% V/ Q 7 6 00011060 _TM_GetVValue@4 1 _: F4 Q8 N, f+ Z
8 7 00011000 _TM_GetYValue@4 2 u1 v" y0 d1 G8 |. h1 M3 k' x
9 8 00010E10 _TM_OpenDecoder@8
7 w* n7 S5 s0 B 10 9 00010F30 _TM_ReturnType@4
, T9 [9 Q- O1 J! [; M" o9 w0 {4 d 11 A 00010F90 _TM_SetFileEnd@8
5 d* F. [- q F+ { 0 r. h4 S1 A* |( H
Summary
! i1 y/ R/ C' Y' @& n
) }! ` E3 W- x' h* H c" ? ? 2000 .data : h m9 w+ d. _5 U$ b: K/ y$ L) P
1000 .rdata 0 X# B/ X3 _1 y; y+ p
1000 .reloc
: u- Y7 j0 W1 g2 [0 ~3 k 15000 .text : i$ X% G5 m1 X& a: G
按照以下方法整理:6 g6 h0 y4 g2 j3 T; ]2 h: o
1>添加LIB说明
; \/ p4 ^4 V- o7 D+ v8 {" L1 O LIBRARY "VideoDeCoder" ;"xx"为DLL名称8 l+ o t* a! e. i# U
DESCRIPTION "VideoDeCoder library"
$ E7 p( W9 s; Y7 U* A1 K3 ?* f 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数3 q( _2 y, m, ?; E2 [$ \
LIBRARY "VideoDeCoder") l0 l- v$ `, x
DESCRIPTION "VideoDeCoder library"
3 x! M6 L) e; I% X: E EXPORTS
' P, l3 v5 H' o ordinal hint RVA name 2 Q) V0 Y* b- }
4 P3 a6 ~5 Q7 T% b2 W9 C, u& l6 h! r 1 0 00010F60 _TM_ClearDecoderBuff@4 0 w8 }6 H/ Q" P x/ u
2 1 00010E80 _TM_CloseDecoder@4
9 q. n8 R% T& a 3 2 00010F00 _TM_DecodePicture@ 8 D3 m6 I# l( G7 Q% f8 _" c
4 3 00010ED0 _TM_DecodePictureH
* u; x2 c9 f6 s. A" ~1 t# Z 5 4 00010FD0 _TM_GetFileEnd@4 8 ~) Y1 y3 ~: C" a. P5 |6 _
6 5 00011030 _TM_GetUValue@4 9 @& l5 U8 E- @$ B5 d
7 6 00011060 _TM_GetVValue@4 , w. ^& u f4 E8 l3 Q
8 7 00011000 _TM_GetYValue@4 ! |7 g6 u( M8 @& I* W& e: P
9 8 00010E10 _TM_OpenDecoder@8 $ B W' d7 b! }7 G2 t) j
10 9 00010F30 _TM_ReturnType@4 ; K4 [) C8 m; L" S8 X; e8 b7 s6 ?
11 A 00010F90 _TM_SetFileEnd@8
* M+ o a. @7 N, t. p6 \ 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
0 g! \6 {: }" _+ I 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
! ^/ s! J( E+ j# p' ~ 最后形成.DEF文件如下:
& G" V! T2 Z/ g% x8 F( s LIBRARY "VideoDeCoder"
7 m9 |5 f3 w# F ? DESCRIPTION "VideoDeCoder library"
( r. W0 _7 { E6 h* O EXPORTS
# {; T' h" o! i$ R7 y/ J" { 8 Q$ B$ u6 X% [. q3 ~
TM_ClearDecoderBuff@4 @1
$ f1 b* Y; g& m) M TM_CloseDecoder@4 @2
5 ]8 P( q$ g( j. }* A TM_DecodePicture@4 @3
7 D0 ]) u2 l6 @0 V TM_DecodePictureHeader@4 @4 7 g0 x& z3 H y; h S# {6 ]" g
TM_GetFileEnd@4 @5
5 Z7 M( W% D8 K9 g2 G# w TM_GetUValue@4 @6
4 V& ~6 y: W1 c& A: V [ TM_GetVValue@4 @7 0 y8 H8 j" P+ v. E! i- R, |" ]: X
TM_GetYValue@4 @8 ( E u0 o, ~" a0 K5 @
TM_OpenDecoder@8 @9
# X$ g7 T) [/ Q4 Y TM_ReturnType@4 @10 5 {% n9 `+ w4 H- I7 E
TM_SetFileEnd@8 @11 & a+ [3 n% S/ {) n3 s- a7 q
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.3 c1 @$ K+ v: E+ ?
EXAMPLE:- K1 `. u2 Q7 {
LIB /DEF:VideoDeCoder.def /MACHINE:IX869 ~9 B; e& R( k& H% }/ C H
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:7 x, y J% C" w" V6 m0 s: e3 U
error LNK2002:unresolved external symbol "functionname@nn"
4 @6 ?/ U% Q7 Y) Z/ F提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立0 j1 ]" d; f6 h+ t
LIB,重新链接即可.
6 E3 e, m+ i1 G A
7 [0 _: G, i. D& z3 B这样就制作成功了符合VC调用方式的LIB了!
" w- X, ^1 ^* c- f. \5 P4 O参考:MSDN2000
" d" x+ U. _4 O9 S' H2 c1 @$ o) s要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
- x4 b% r, {) `8 f- q9 ~IMPDEF xxx.def xxx.dll
C7 i2 m! G6 x& f这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
$ G9 x/ O* g. [而在C++BUILDER中!+ |; H2 b8 v$ S* R9 {; e
__cdecl的函数输出前会带一"_"
/ P4 q8 X1 b% l7 D__stdcall无特征,只输出函数名8 M' h0 k' F: C' w. \3 C
__fastcall函数输出前带一"@"
8 J- [) ] ] l. T+ {% @都无"@nn"后缀格式!% m/ D5 W" t9 i" ?; ? q
在VC中!
2 O* _2 w" e: ~6 O__cdecl无特征,只输出函数名, l% A8 p" i, M: H0 F0 ]9 g
__stdcall的函数输出前会带一"_"后缀带"@nn"
' W% o- G6 Z( p__fastcall函数输出前带一"@"后缀带"@nn
9 C1 l; w& _* U0 |0 i只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|