|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!! v, m e0 _6 @0 _/ M* X2 Z
$ n& `# s/ |9 q! T9 S1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件2 }% ~: `# P/ f5 J5 k
EXAMPLE:4 v! u7 s: h7 J) E3 h; W
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
M! R& z: ~2 \# P3 }5 ~ 0 g) e/ P/ P( d9 E* L0 D
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件9 H) y J. m4 n8 z* [, ?! B
EXAMPLE:. X' m% Z& N4 }+ y, y2 @* H* S! L
VideoDeCoder.DEF 文件内容如下 l- U U, p% S* O' u( Y
5 d3 p5 i; x1 ?2 K* ^$ m
Dump of file VideoDeCoder.dll
4 i/ W7 h' b3 Z ) T X5 y, r7 c2 x$ e5 P8 M
File Type: DLL
3 P8 \' P0 f1 T% n % A: m8 L) g6 _% I3 y! m
Section contains the following exports for VideoDeCoder.dll 0 ]" s* t( L3 z2 l; o& c
5 H! I5 s: ~2 s* B: o! [6 `- S
0 characteristics
. b2 `+ e! b6 Y 3D49E48F time date stamp Fri Aug 02 09:46:55 2002
@ F0 @2 _* ?, u# s% A2 T 0.00 version
2 Q- h6 k @! D6 {5 g3 e M- y, X 1 ordinal base
2 I; @+ ^" {) C, w. Z: A: ^ 11 number of functions ) K1 j/ y4 }. ?) O" _ j
11 number of names
6 h4 r4 g9 ^3 v( l! }7 [% E
, L% B: ]: {, o: Y, i ordinal hint RVA name 6 P Y; w o2 L7 K q
, e# J7 O: m, w9 [7 |( A7 C, ^ 1 0 00010F60 _TM_ClearDecoderBuff@4 * p8 w; ^2 N: U! a# g: g5 p
2 1 00010E80 _TM_CloseDecoder@4 + N. w, t8 W1 p6 m3 K6 P" s
3 2 00010F00 _TM_DecodePicture@4
1 H$ k( `0 W/ k 4 3 00010ED0 _TM_DecodePictureHeader@4 1 n( H: m0 B0 V+ c* |
5 4 00010FD0 _TM_GetFileEnd@4 * Y9 s! A+ s0 s. q/ I* _
6 5 00011030 _TM_GetUValue@4 1 P" q) p4 U! G! ]; x9 G( G
7 6 00011060 _TM_GetVValue@4 ! B$ z8 P& C: e8 g$ b0 H, E/ V2 T
8 7 00011000 _TM_GetYValue@4 & I! t& p2 z3 V9 `# A/ S
9 8 00010E10 _TM_OpenDecoder@8
8 U' c3 s) ?2 _ 10 9 00010F30 _TM_ReturnType@4
% ?5 s$ J, ^& L* E 11 A 00010F90 _TM_SetFileEnd@8 2 _, O) ]9 X% Z4 Q3 J
' X( z! |: }/ H- Y8 @# I+ I, r
Summary 9 V; Z& _" G. W: w" s# q
7 v# Q2 |& N: n1 U' Y$ P 2000 .data
6 U0 w9 n. O1 d/ c( }. w& M u3 m 1000 .rdata ! s7 \ Y; W. `. {" P! F5 |
1000 .reloc - o+ x- S( n O0 j8 K% |! _
15000 .text
0 H1 V0 A0 O* A% |8 d7 l 按照以下方法整理:
/ M# a' t, z; i1 a5 G# |) R 1>添加LIB说明1 a9 ]! b1 B* [4 ]2 q! [
LIBRARY "VideoDeCoder" ;"xx"为DLL名称% y# N" _* p3 O
DESCRIPTION "VideoDeCoder library"
) `) y4 n; r5 I! h 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数' {1 K0 }7 c; G: |5 B* C
LIBRARY "VideoDeCoder"
( q F; H! r- x) {( p! h+ y9 Q DESCRIPTION "VideoDeCoder library"
! ~! A( h! c5 N8 j _3 P' [: B7 R EXPORTS
: l& n. o- t& T: M. r: r8 _* j ordinal hint RVA name
) ~) J) c! L6 ]+ H * F7 f: x3 n0 \
1 0 00010F60 _TM_ClearDecoderBuff@4 ; ?, Y$ x1 |7 l' g; N+ r6 E
2 1 00010E80 _TM_CloseDecoder@4
# m; u! l9 ]: E 3 2 00010F00 _TM_DecodePicture@
: d# x- W1 i- t2 C) s% g5 A, l 4 3 00010ED0 _TM_DecodePictureH $ {; c W7 s5 A! b& W& n$ z
5 4 00010FD0 _TM_GetFileEnd@4 ' F; L5 x$ v4 t. b |( a" e
6 5 00011030 _TM_GetUValue@4 6 y* v2 o& Z2 x, T" L8 ]
7 6 00011060 _TM_GetVValue@4
& X9 H4 ?+ E- W6 `& `: w 8 7 00011000 _TM_GetYValue@4 & C; N% C# K4 q2 y8 T4 p
9 8 00010E10 _TM_OpenDecoder@8
. V; u Z D, R$ {6 k 10 9 00010F30 _TM_ReturnType@4 / N* g1 N+ P% L7 W
11 A 00010F90 _TM_SetFileEnd@8 & g6 n Y# t& [2 I1 \( \
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号, {6 D4 s6 P4 z9 U
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
, v$ I/ N. I4 B) I) ^: _ 最后形成.DEF文件如下:
! I: h- z0 G( R2 X LIBRARY "VideoDeCoder"9 a# A# u6 L$ h6 _# v
DESCRIPTION "VideoDeCoder library"
, ^/ K& ~- o' Y, j EXPORTS2 q) A/ w$ v4 P+ e0 ~( R
7 j. ` a$ L5 L0 ]2 o! K( I
TM_ClearDecoderBuff@4 @1 3 C5 U% L, ]3 q! D% Q0 [& n) B4 S
TM_CloseDecoder@4 @2
2 R8 A* v" h, Q TM_DecodePicture@4 @3 % t8 @ } V/ Z: p+ e
TM_DecodePictureHeader@4 @4 ; [% f. v0 y P$ p3 s) ?& i. S
TM_GetFileEnd@4 @5 : b) J4 M1 n8 M" t+ e
TM_GetUValue@4 @6 , A8 i7 r# j( Q$ Y
TM_GetVValue@4 @7 : R5 q9 S$ K4 }' q$ S' T
TM_GetYValue@4 @8 / R+ |. `' e3 Q7 N: i
TM_OpenDecoder@8 @9 2 q* e8 n! @4 C/ Y5 l. X J& e
TM_ReturnType@4 @10 ! m6 n, X& T2 T4 f# l
TM_SetFileEnd@8 @11 ; \ @# m7 D) I
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
( z. P! y6 G) R EXAMPLE:: @& e$ Y2 z1 {) H* Z& I
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
- }- g; Y2 l$ P4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:( g, ], h `8 U D+ y7 Z
error LNK2002:unresolved external symbol "functionname@nn"
2 f O6 L: w6 n8 F+ [' N提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立! u1 k% Q0 j: i
LIB,重新链接即可.
4 l+ a9 i T" z6 Z3 Z% r
E( A: c. G7 K* k4 u这样就制作成功了符合VC调用方式的LIB了!8 y4 l: V3 W) C0 ~- _5 V* a
参考:MSDN2000
: z6 S1 b: ]6 U, ~0 U' ]- c要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!: H, e" ]# D& o ?% d, e, M
IMPDEF xxx.def xxx.dll
* K! ~, U% A. G6 @' |这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
' U4 w# r( [8 O而在C++BUILDER中!
- r) l6 C3 x, G" E9 ?4 W8 `__cdecl的函数输出前会带一"_"% j3 L1 a* x% ?( t# @7 b' e" W
__stdcall无特征,只输出函数名
% A' k4 Q' [8 v__fastcall函数输出前带一"@"
% z* a% {- P4 h# G) w* Q都无"@nn"后缀格式!
" R+ q; f' y- Y: D8 I6 e$ _在VC中!# ~* a; n$ {9 v1 B& E- r/ d
__cdecl无特征,只输出函数名+ b, J( r; k0 b X3 S6 ~# K
__stdcall的函数输出前会带一"_"后缀带"@nn"
& X0 O- H* \; f2 {__fastcall函数输出前带一"@"后缀带"@nn
! g% f6 k$ \& `, q K. ~- F只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|