|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
# F" u8 c9 W6 L
4 T5 p2 k3 n8 N6 y) n, R1 b& a1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件& y& g% |9 F+ x, m6 a: V. n; J
EXAMPLE:
" Y. o. x- y) C% ?. P# Y$ S( w! u" F) Z DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def2 g6 K2 ?9 K# h8 i, t% F% E/ f! W
2 ^# C; g, O! S. k
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件8 z# V" H! x, g3 h6 Q
EXAMPLE:1 A ]( D; e1 T' l- K) R4 I4 h
VideoDeCoder.DEF 文件内容如下
3 y+ C- }1 S. L: L" a( d# B - ^& q" ?7 Q6 n# z5 G e
Dump of file VideoDeCoder.dll / Y$ v% h* B( `# G' E) J
) K! M" B7 ?8 q, ~7 d" U+ t: y$ M File Type: DLL
8 m/ d9 q7 v) E U4 w
3 A0 x- h6 `% f Section contains the following exports for VideoDeCoder.dll ( p5 O, t6 q- D& m0 V, Q4 [ @
, h X/ o- P9 W: }
0 characteristics
$ L3 \) ^# a4 k: S' f 3D49E48F time date stamp Fri Aug 02 09:46:55 2002
. t, a/ H' Z2 S# S6 S 0.00 version
3 B3 T1 n! j/ c. s5 T" x 1 ordinal base ! X) l' f% k2 b4 h: C) \$ x0 e0 ~
11 number of functions ( ~, [/ t8 Y: x' k+ L" W3 O
11 number of names
( ~* J: ?1 `: G & e; i6 A, g+ V( s% G
ordinal hint RVA name $ r3 m- v( j' r; {1 S& l
' d9 T/ g( @+ X) q; Q+ q. K" U* a( V
1 0 00010F60 _TM_ClearDecoderBuff@4
( t. f a/ ~# s/ }% M B 2 1 00010E80 _TM_CloseDecoder@4
0 P8 u: S( O3 Y7 K# [- N 3 2 00010F00 _TM_DecodePicture@4 * F) Q8 C* C$ f! @! F
4 3 00010ED0 _TM_DecodePictureHeader@4 F& Q5 L2 h) p3 X" P$ {
5 4 00010FD0 _TM_GetFileEnd@4
. { j$ | f1 {* J H/ v, C0 S% e 6 5 00011030 _TM_GetUValue@4
9 U% A' l2 C- r; l1 ?8 w7 N 7 6 00011060 _TM_GetVValue@4 S4 R9 l, l: q9 I5 C: N
8 7 00011000 _TM_GetYValue@4 ' B( s7 [) H- N& m
9 8 00010E10 _TM_OpenDecoder@8
; E1 d7 W7 @3 V% h$ P: z6 [2 d 10 9 00010F30 _TM_ReturnType@4 8 b$ [1 G" `. n8 q# o0 j! S' H
11 A 00010F90 _TM_SetFileEnd@8
+ Y; Q$ G5 a6 z4 y 7 S" C* V6 @ x2 ?3 z, F
Summary
! `9 {) c0 H" c# Q
8 T- V. n, x Q6 Y 2000 .data $ `) U( M5 F9 A( Z1 t+ d9 L9 x
1000 .rdata 0 K' q) i# d4 L+ c
1000 .reloc
7 ?1 P1 J6 [' U$ v: W; @! m; l 15000 .text . h# \! V+ R4 h) R6 Q. e
按照以下方法整理:* D( x" \' t% Z+ \+ j6 p5 O8 S I) ^
1>添加LIB说明: w7 q! e4 b& w* p4 z( R
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
8 h" a- b& o* ?& U5 e DESCRIPTION "VideoDeCoder library" # n3 i: A2 y. B7 x2 w% Y+ _$ d" L
2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
- m& w/ A$ o# ?, D LIBRARY "VideoDeCoder"3 `( [* Q/ Z+ t
DESCRIPTION "VideoDeCoder library"
1 m7 ]; }: m' A8 X. I EXPORTS
5 h, e& y* J8 G Y& I! e& g8 y ordinal hint RVA name
/ ?* s: Q5 H |' c; n * D! G Y/ S* V- l: U
1 0 00010F60 _TM_ClearDecoderBuff@4 1 U8 k1 J$ [; W; o1 w
2 1 00010E80 _TM_CloseDecoder@4 . m2 x1 Q+ }/ G ]# X0 z& p) w0 N# R
3 2 00010F00 _TM_DecodePicture@ ! k) P! G4 e7 Z V K
4 3 00010ED0 _TM_DecodePictureH 0 ]& t6 _( F% E. R
5 4 00010FD0 _TM_GetFileEnd@4
# m: q' y: W1 i, o% t2 E: G 6 5 00011030 _TM_GetUValue@4
: M$ [* S6 F/ F: ]; f, x 7 6 00011060 _TM_GetVValue@4
' j$ x; l$ U5 W 8 7 00011000 _TM_GetYValue@4
6 L' i9 u: h* U. l5 I ~ 9 8 00010E10 _TM_OpenDecoder@8 ; X, x; R4 D8 Z& H! E
10 9 00010F30 _TM_ReturnType@4
/ {2 c5 E8 o+ M! k9 v5 k5 O4 o0 K 11 A 00010F90 _TM_SetFileEnd@8 ) P( \& v( S1 e# Z5 t
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
) v/ j5 u+ Z2 ^, d/ c 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
. m; N* G' S7 d2 d 最后形成.DEF文件如下:
' ^9 d) C; {5 ~) s LIBRARY "VideoDeCoder"
# `9 @0 _ e+ S$ N. N: T5 ?' P DESCRIPTION "VideoDeCoder library"8 V, v+ I0 C' a) K) _. C
EXPORTS
( Y& ^& w. e! Z; p" t 2 q+ u* W {1 q7 f
TM_ClearDecoderBuff@4 @1
4 O L% Q/ n4 y TM_CloseDecoder@4 @2
/ y* p; a/ A& h. i* X) A, H TM_DecodePicture@4 @3
5 C; X1 B v' }5 V. E @' o TM_DecodePictureHeader@4 @4 . ^: t2 U, m) z$ S4 D* b; d
TM_GetFileEnd@4 @5 , \: q; n; N+ X& F$ t5 u5 P
TM_GetUValue@4 @6 9 F: T! g+ {+ `$ [3 w
TM_GetVValue@4 @7
' [' q4 F8 X5 z ^- J3 b' W- m TM_GetYValue@4 @8 9 Q' S Z$ f! f9 O! r
TM_OpenDecoder@8 @9 1 X4 A+ f4 r6 U" K6 ^+ o
TM_ReturnType@4 @10 : L/ u8 _' h; s( Z2 l
TM_SetFileEnd@8 @11 2 o! o5 b+ a4 @( T2 B( p
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.: W' h, w/ i9 {6 {# W1 T+ q
EXAMPLE: Z1 Q9 @% V3 F% W+ }0 v
LIB /DEF:VideoDeCoder.def /MACHINE:IX86: j3 K3 {8 @ ~/ z o
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
) T* F! b C) C6 d0 K1 q, r" j) } error LNK2002:unresolved external symbol "functionname@nn"* E4 T% U6 z" O( P! _
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立/ U( G9 |8 Q# G" s0 G v4 G
LIB,重新链接即可.
/ \2 P. M1 D+ g' P2 W+ z' i$ Y7 S: t$ z I
这样就制作成功了符合VC调用方式的LIB了!
0 \- I. G+ R4 B参考:MSDN20000 C* g0 K! ]. s$ b7 ]2 `- ^2 d
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!5 F' o5 t P& b' s+ |& d
IMPDEF xxx.def xxx.dll
( f4 i7 W' N t这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:, [0 l' x+ J" `& b; |, {
而在C++BUILDER中!
, Q) h4 p7 V; L. O/ s: N) [0 k( Z9 p__cdecl的函数输出前会带一"_"
- S K& U+ h/ i$ K' R1 d* u6 e2 I__stdcall无特征,只输出函数名- i8 g' ~0 _* i8 W) _9 n% ^
__fastcall函数输出前带一"@"
! n3 @0 K2 m9 M7 [* \* r Q都无"@nn"后缀格式!
8 j2 L: d8 I' `在VC中!
* }0 p: C+ k" K__cdecl无特征,只输出函数名
) `$ G9 d6 S; C6 Q# m; J__stdcall的函数输出前会带一"_"后缀带"@nn"
* G: s' D& u8 A6 s2 @__fastcall函数输出前带一"@"后缀带"@nn. K, Q1 `9 F, m+ Q2 I4 C
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|