|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
6 S1 v* z+ `( A9 J8 m5 F" U" |7 l' k& ~
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
5 V. o0 i, Z: X9 F+ ~2 E. C" ?: e$ h EXAMPLE:6 v- c1 I n) j6 S: B3 J9 C
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
1 x" S, R5 p" g4 ? 4 o | r0 R5 V. |* U" X
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件7 q. }) x' E* ]- x
EXAMPLE:
) ^; I! ~ D9 U VideoDeCoder.DEF 文件内容如下, Y) v4 Z. O6 t. I$ ` X
# e6 T# a7 [" N- s4 n Dump of file VideoDeCoder.dll 1 y% ~3 i, m6 S7 D3 Y+ r# R1 a
3 S# X$ `+ Q4 \- F File Type: DLL 8 X: t9 B* S, u; \5 `; }2 H
0 i5 r7 u( m+ z. g ?
Section contains the following exports for VideoDeCoder.dll 4 k9 z! J. a5 C1 u! F& R
9 c& P& N* N F2 V0 B 0 characteristics
6 S; t9 V2 C# B! v% M! s. C/ W 3D49E48F time date stamp Fri Aug 02 09:46:55 2002 + c" ] h9 h8 X Y
0.00 version 7 n" W- ~1 x" b+ K: W$ }, [- `* W7 n2 K4 {
1 ordinal base & @9 @6 {% @) ^! ~4 o j, E& S# b' o
11 number of functions
; ~* D& N0 X5 F5 ~* G: v- q 11 number of names
# w- q1 Q+ h/ @: B) S, x% I8 c9 |3 e % |, s. `5 I& _: p% _
ordinal hint RVA name
# F* S+ Z1 C8 v8 q* H
2 D; \4 P! J+ _" _2 c 1 0 00010F60 _TM_ClearDecoderBuff@4
9 q6 ^0 e+ c9 ]$ [( G6 [ 2 1 00010E80 _TM_CloseDecoder@4
5 m' H8 \4 p" K1 y( e+ J# t6 ] 3 2 00010F00 _TM_DecodePicture@4
9 b1 B5 l D# P* D B2 x0 W 4 3 00010ED0 _TM_DecodePictureHeader@4 9 R# U) ]+ w; }6 B- z! s- I
5 4 00010FD0 _TM_GetFileEnd@4 / q% g5 F0 I3 f
6 5 00011030 _TM_GetUValue@4 6 z6 U( [7 M8 W ?7 I
7 6 00011060 _TM_GetVValue@4 - {! ?8 u5 k0 K* T+ F7 j6 O
8 7 00011000 _TM_GetYValue@4 : U' m; ?( P( o% ^! T$ ^0 V
9 8 00010E10 _TM_OpenDecoder@8 4 m' W- a, H7 i6 E6 l" p0 t
10 9 00010F30 _TM_ReturnType@4 3 E, }/ e% E, |: ^5 g
11 A 00010F90 _TM_SetFileEnd@8
! T8 A) K" m, ^. S* C 4 L8 k3 c' f4 x. h: b
Summary * K" b# i5 _; @2 d( [% Q
+ i$ I, f4 v: T8 k 2000 .data & n) }$ `9 D1 y8 S0 T
1000 .rdata ; ?1 W/ `0 A1 c' L1 r3 ?
1000 .reloc
0 r! g& F* _2 b& o 15000 .text
3 E. f! Y+ M1 q2 F" m% D 按照以下方法整理:- S7 v; s2 w3 C- X
1>添加LIB说明' f, e6 Z. r" k2 q: B
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
7 h* G2 g Q: a/ ~) r DESCRIPTION "VideoDeCoder library" ' K* j! Y' t4 E7 E
2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
; W; w( a% f7 j LIBRARY "VideoDeCoder"! O( z! M! k$ Q$ v3 n- _4 h7 A3 r" @- [* W
DESCRIPTION "VideoDeCoder library"9 E7 O4 N t2 q6 k# X
EXPORTS& w h' F& L1 R6 h8 G; l
ordinal hint RVA name
3 x- m$ r- D! B; Y
2 o8 d1 t2 i* s5 U' b; G 1 0 00010F60 _TM_ClearDecoderBuff@4 , r: v4 u! I) D6 h3 @
2 1 00010E80 _TM_CloseDecoder@4
: x7 `/ G) C' Y8 }2 D% s4 ]7 w 3 2 00010F00 _TM_DecodePicture@ ! V) d2 {' h* y$ c. ?8 d
4 3 00010ED0 _TM_DecodePictureH
b! ~, `# c/ X6 I7 h6 ]/ X0 s: b 5 4 00010FD0 _TM_GetFileEnd@4
3 t% r& j! U, e, d& V' g6 k* y 6 5 00011030 _TM_GetUValue@4 3 q% e O( K' _1 R* m; k7 m+ Q
7 6 00011060 _TM_GetVValue@4 % \ K7 R. e v P, |1 _ y
8 7 00011000 _TM_GetYValue@4
4 {7 ~, z" l4 O* _ 9 8 00010E10 _TM_OpenDecoder@8 - x9 N8 ^3 n0 @; u3 n. y2 ]+ G
10 9 00010F30 _TM_ReturnType@4 ; F: \0 P8 \7 w
11 A 00010F90 _TM_SetFileEnd@8
# p5 i( q6 g r, z 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
( N, ^3 B+ ?5 H( y 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").5 f/ K+ o. O5 P# m
最后形成.DEF文件如下:
8 U4 y; x8 }1 P: M9 l" y# B LIBRARY "VideoDeCoder"8 F+ q8 H3 I ^/ z4 Y5 I
DESCRIPTION "VideoDeCoder library"2 e1 b+ q/ h+ u) w
EXPORTS1 m! E9 K, F+ T/ R. M4 l
# |! q; X* b* ~( |% ^
TM_ClearDecoderBuff@4 @1
$ W- h. D% H9 x+ R" j! S. H TM_CloseDecoder@4 @2
. @( P0 |5 ^- @. ]0 m/ ~ TM_DecodePicture@4 @3
V6 N+ [; l0 K! @ TM_DecodePictureHeader@4 @4
% q0 s( k, h% T% C TM_GetFileEnd@4 @5 . @+ w9 P, P. z" w' e9 {
TM_GetUValue@4 @6
/ W- O$ w8 E4 ~: `8 W TM_GetVValue@4 @7
7 K# ^6 y1 y6 ] TM_GetYValue@4 @8 * q, G! o) ^3 S1 A5 }
TM_OpenDecoder@8 @9
7 e/ Y( a/ q/ \; F* M. d TM_ReturnType@4 @10
5 m$ W/ ?& d9 `# L3 G TM_SetFileEnd@8 @11 - {* Q4 w0 H& i
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
& r8 g9 B9 q3 f" C2 s" b6 w# h EXAMPLE:
# M1 m6 I% X/ K* X, S LIB /DEF:VideoDeCoder.def /MACHINE:IX865 A7 L$ C1 J, t: p. \. J' j/ U
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:; ?% _6 H+ X% N
error LNK2002:unresolved external symbol "functionname@nn": x- ~7 O+ h- K% ^5 Y6 C
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立+ l4 G: h2 M6 H! i) ^; D0 M
LIB,重新链接即可.; r3 v$ G8 P( D: o
) Z% U" x2 K, |: p' P2 E
这样就制作成功了符合VC调用方式的LIB了! \7 C6 m5 @. d8 Y
参考:MSDN2000
/ | k+ ~/ P1 a- z* s要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!5 i" p M* ?1 }7 A
IMPDEF xxx.def xxx.dll
& [8 O! m7 p5 n/ L7 w这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:# l) W3 j. n+ f
而在C++BUILDER中! A1 I, h, y1 D2 a% P$ `
__cdecl的函数输出前会带一"_"3 i' [7 I9 y1 Z1 i6 Y+ _# g* [! m
__stdcall无特征,只输出函数名. V" P( N* s0 s" V' n0 ^/ ?# x- N
__fastcall函数输出前带一"@"% l! {" L9 \- ]3 l
都无"@nn"后缀格式!
/ _- i# z) k4 V% d, Z5 P+ j在VC中!- h! k0 T7 F4 V9 w" A
__cdecl无特征,只输出函数名
1 f4 Z+ P# A1 O9 M9 L- O9 c( o__stdcall的函数输出前会带一"_"后缀带"@nn"
# n9 E% \+ p. f__fastcall函数输出前带一"@"后缀带"@nn$ L7 x/ ^4 i" r, T M* C
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|