|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!2 h( Z% @$ c! Q' j( k7 e) ?
# X( H9 {9 ^: _! Z& _0 r
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
" ^8 b: I- i6 c( R EXAMPLE:
c! e( V/ m7 O0 Q. Y DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def9 Z5 N5 _) ^2 v, {- ]" J# L
+ M' t6 o& J1 c+ I2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件7 H ~; E; v8 M& U# E# z
EXAMPLE:
# o* Z4 E( x$ Z0 ~& C! `: D VideoDeCoder.DEF 文件内容如下
; H" p9 Z, {& K& @9 \ ; j! c X0 X7 h8 j' a8 n" ^
Dump of file VideoDeCoder.dll
A: ?& W( q6 ~: O
+ P: u3 w) n2 o( G" _ File Type: DLL
: w! b- j& }. h% o% s% m
) `2 N N$ |, [% J Section contains the following exports for VideoDeCoder.dll 7 U7 H/ m. B2 e: b2 h
* h. |" Q8 l% y& v* @. O2 o2 I: o! g 0 characteristics $ B/ L6 y0 m' Z- ~
3D49E48F time date stamp Fri Aug 02 09:46:55 2002
- K: D2 r; q5 `, A0 {. z, x 0.00 version ' N7 s/ E' I; q; R3 m: l3 [+ I
1 ordinal base
& Q. @& X2 t' Y0 a4 H4 ^ 11 number of functions # N7 L5 S2 C" G& C! L$ z) C8 O
11 number of names . _5 g5 c3 i3 h
# ^( N6 y. \9 w: q ordinal hint RVA name
& K. G9 {% ^/ [ , `$ s* j0 J+ k+ u q( a
1 0 00010F60 _TM_ClearDecoderBuff@4
, h- ^) s9 ~2 t6 f0 c: V 2 1 00010E80 _TM_CloseDecoder@4 + b/ {4 q) K& ^! c J
3 2 00010F00 _TM_DecodePicture@4
$ Z% {1 ]1 p, a5 K5 s% ?& U% _ 4 3 00010ED0 _TM_DecodePictureHeader@4 * S/ I9 A* a* o* J: b; W. U( T
5 4 00010FD0 _TM_GetFileEnd@4
( k# X; d$ G0 v$ M! G) w( }8 e 6 5 00011030 _TM_GetUValue@4
3 d& S7 L: y7 @ 7 6 00011060 _TM_GetVValue@4 e% n. O3 D$ p# Z8 j+ o s
8 7 00011000 _TM_GetYValue@4 / h j+ l! _9 d) w
9 8 00010E10 _TM_OpenDecoder@8
1 w4 r1 d9 c7 h 10 9 00010F30 _TM_ReturnType@4
7 {- M7 m) U* _) r4 R* ` 11 A 00010F90 _TM_SetFileEnd@8 4 y, J2 z* B6 z, W) G1 L5 V2 F3 K# w
( G& s* j5 `4 \$ w Summary 4 b5 U9 A: F# Z1 r3 g& e0 C G
. i; K* f$ i6 H* `1 x$ a) R2 p; f! j 2000 .data 2 F0 F3 b% r& ~( I
1000 .rdata
' S: Y' }* @* Y 1000 .reloc ' R3 m" [( [0 W# l2 ?- [
15000 .text 3 u2 y5 W- w* }8 k/ S
按照以下方法整理: P4 u: S7 T+ R0 O! T8 V
1>添加LIB说明
N, b l3 D4 A0 d; ?, D& V& C LIBRARY "VideoDeCoder" ;"xx"为DLL名称
- G% O+ ]5 x E2 {2 Z DESCRIPTION "VideoDeCoder library"
( @- z5 n; G5 n# P0 J; b5 V7 b 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
0 O) d- U/ f& k3 q- E% s1 F$ L; E LIBRARY "VideoDeCoder"
/ w5 @( c M" a DESCRIPTION "VideoDeCoder library"" ]8 B% ?) l( N! |' m% z
EXPORTS* Q1 E( H: S6 D3 N; v
ordinal hint RVA name
( |( e3 Y: ]- `; q' U
4 p4 Y' }& ~6 K0 {0 g5 x# i! T 1 0 00010F60 _TM_ClearDecoderBuff@4 " u+ m! A2 s; ~, j
2 1 00010E80 _TM_CloseDecoder@4
* o2 C |" H" i; B$ v& H 3 2 00010F00 _TM_DecodePicture@ ) I, z% M. e: ?$ C
4 3 00010ED0 _TM_DecodePictureH
3 h8 V1 O* O4 Q! i3 E: r; | 5 4 00010FD0 _TM_GetFileEnd@4 ) Q1 b9 A! |$ Y
6 5 00011030 _TM_GetUValue@4
% m# i$ G. e9 Y& t 7 6 00011060 _TM_GetVValue@4 # I% t& u7 D3 r; m' l
8 7 00011000 _TM_GetYValue@4 8 R+ R8 {8 T( S' o! n& z: C
9 8 00010E10 _TM_OpenDecoder@8 # [, a4 u5 b: ~
10 9 00010F30 _TM_ReturnType@4 # @1 }" e( O& c- Q( r6 f- Z, R
11 A 00010F90 _TM_SetFileEnd@8 ) o1 i. m6 h, x
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
1 O1 S, d% F" F6 V 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
. h8 d* Z# K5 c: e6 b6 Y$ X 最后形成.DEF文件如下:
/ J: J; ?( v1 e+ I: w LIBRARY "VideoDeCoder"
, w5 ]; m# }$ D( k% g6 d8 L DESCRIPTION "VideoDeCoder library"
( p7 z' R8 ~/ _) l EXPORTS
l d2 [' [" @$ x/ ~) ~$ Q; t 9 m+ m* b. {1 K5 X
TM_ClearDecoderBuff@4 @1 & F! {( y" X" u) [
TM_CloseDecoder@4 @2 : x6 w7 ]" h4 f- z k p! ~ S
TM_DecodePicture@4 @3 # n1 [& p# K$ @2 J' Q: ]) n
TM_DecodePictureHeader@4 @4
! m" H. R* }$ N TM_GetFileEnd@4 @5 ! {; w4 J+ \7 G4 a* B
TM_GetUValue@4 @6
5 x" [* m* n$ j7 l0 [ TM_GetVValue@4 @7
% N7 ^+ {2 U0 G1 n TM_GetYValue@4 @8 1 ^# I* }4 i9 Q+ w2 Z# `- t# z# s; y
TM_OpenDecoder@8 @9
. s$ R+ C; {. H2 e+ l/ `/ M- D TM_ReturnType@4 @10 6 N2 s: J" ^& N
TM_SetFileEnd@8 @11
% U0 ]3 f$ F1 J3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.. V5 N7 h& c* i- I9 K
EXAMPLE:9 V" t( B9 N) U1 s. x2 B) k
LIB /DEF:VideoDeCoder.def /MACHINE:IX86& V1 m7 ]. x$ f4 i
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错: E* ?/ |; m% `4 n- D
error LNK2002:unresolved external symbol "functionname@nn"" I: X8 Q: o# G; @3 _" u$ ?
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立) }9 L/ j7 ~ { N
LIB,重新链接即可.
) K. [% s" h. q/ U9 B6 k% O% a/ U/ q. L! z
这样就制作成功了符合VC调用方式的LIB了!1 c3 G9 M8 g5 V$ |3 n. B
参考:MSDN2000
! w) z! v1 `: \! j) R" J要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
: F) r& g" y x7 @IMPDEF xxx.def xxx.dll& q: o! Z" S( ]! V+ Z
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
+ p2 {) n+ K. a8 G" I9 {而在C++BUILDER中!9 B% E4 n7 Q5 o$ m& K
__cdecl的函数输出前会带一"_"
" S. U) G1 j. V__stdcall无特征,只输出函数名- Q8 c+ n$ Z# l$ w3 Y
__fastcall函数输出前带一"@"7 I8 j. N! w# a+ V
都无"@nn"后缀格式!
" ~$ P5 h& _5 P6 `+ K在VC中!2 F9 ~8 D" p9 A: q* T& A1 m
__cdecl无特征,只输出函数名
s. { v, S5 \* E7 x1 M__stdcall的函数输出前会带一"_"后缀带"@nn"! k6 D$ G; d" |0 w2 C9 N. X
__fastcall函数输出前带一"@"后缀带"@nn4 u% ~* `- U( E. ^
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|