|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
2 n/ G" N, |+ K; J. k& v0 @+ a* G# ~! l- y9 ?
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件% H3 N- T7 ^; ^" h- h2 O
EXAMPLE:$ |: @: K% J8 \; c& L
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
; c, y' B, p/ p: C
# K+ _% k% B0 I9 D2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件4 |- t4 v1 v$ j
EXAMPLE:
2 i8 O6 Y9 {3 e% q- K2 P VideoDeCoder.DEF 文件内容如下
2 D* o% }. S/ f h4 D5 h
C6 z& l% h6 U. ? Dump of file VideoDeCoder.dll
9 O* ]# T- g0 `
1 L# b- o- B1 ?) u M File Type: DLL
" K" U2 h$ O- _+ Z9 j 6 S% \5 V: S4 k
Section contains the following exports for VideoDeCoder.dll & @* B: M$ W1 _/ `, |* _' F: [5 Z
$ N" c! W- E7 ~* P' {9 {2 ]
0 characteristics
" Y! d2 a% V8 A9 { 3D49E48F time date stamp Fri Aug 02 09:46:55 2002
$ i8 @4 Q" @1 I 0.00 version
% q' ?5 U' c" B! y 1 ordinal base 0 b. c" O( L( i+ g) f& {4 ]
11 number of functions
( H$ z, c e6 K5 ^2 Q. e, c 11 number of names
2 _) d/ H- B B3 V* q( z2 r
. W, v' I) Q2 C( N6 r ordinal hint RVA name . Q0 M4 n) ]4 X) J* N
, Y9 N! l+ N# j# |- |
1 0 00010F60 _TM_ClearDecoderBuff@4
/ e: W# ^7 q6 s6 R( t/ W; S 2 1 00010E80 _TM_CloseDecoder@4 4 p) j. {9 |2 C, ?" C: p1 ^
3 2 00010F00 _TM_DecodePicture@4 ) s3 d- v$ R( w" v1 N
4 3 00010ED0 _TM_DecodePictureHeader@4
$ Y! F# ~9 M/ L5 A7 K 5 4 00010FD0 _TM_GetFileEnd@4 4 h" A- b+ |7 H" j
6 5 00011030 _TM_GetUValue@4
: l! k- I5 M" N- R9 i+ _$ `* z# l 7 6 00011060 _TM_GetVValue@4 ( c2 e" i" t5 w; `9 v
8 7 00011000 _TM_GetYValue@4 5 r8 e2 F$ |& B# H: l
9 8 00010E10 _TM_OpenDecoder@8
- }7 s& _- t. Q! [6 K 10 9 00010F30 _TM_ReturnType@4
9 I' z% S7 Q) L; N, I/ B 11 A 00010F90 _TM_SetFileEnd@8
. H! [" z$ {8 X* u % B" D I) ~0 j6 F. ^, Y
Summary & }: m' E" [: N: p" T5 C; f
4 M3 s% ^" N- p# s5 U
2000 .data
5 e. G0 [, y: U* x1 G 1000 .rdata - ?0 h9 Z T, Z$ [/ i. L2 d9 ~( M
1000 .reloc
" A) a/ C; o4 b* }" x; [& n/ E6 x; R 15000 .text
2 N1 s, w4 S: m+ n 按照以下方法整理:7 w; |; `5 R6 f
1>添加LIB说明
F7 ~8 u0 M4 _" R9 Z" v1 |5 m# ~ LIBRARY "VideoDeCoder" ;"xx"为DLL名称
* G( X) \) u$ t. v. J) [ DESCRIPTION "VideoDeCoder library"
( p" y6 e9 N( h( H* R' a" p 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数; W: G! R: H& `$ h9 k
LIBRARY "VideoDeCoder"3 @3 `) C, {& O6 P% [1 s
DESCRIPTION "VideoDeCoder library"
1 `; k% d& w+ v- H) T EXPORTS
v0 X) k2 r( t8 R ordinal hint RVA name
' H$ G s5 ]. k3 l( x# E8 g- j1 s 7 d+ Y; ^' W. L" E& q
1 0 00010F60 _TM_ClearDecoderBuff@4
, M1 W J- P7 F( ^, m5 z( {8 d 2 1 00010E80 _TM_CloseDecoder@4 # t- \6 U% U, X0 d6 A# }# Q
3 2 00010F00 _TM_DecodePicture@
5 y# [( b3 @5 E- q6 s 4 3 00010ED0 _TM_DecodePictureH : u# }" P- N. u5 ^7 Z9 c$ x
5 4 00010FD0 _TM_GetFileEnd@4 . h8 g% R" j/ t, x8 Y
6 5 00011030 _TM_GetUValue@4
( J3 N- u6 v$ s- }% [2 U) R9 U3 k& x6 n 7 6 00011060 _TM_GetVValue@4
2 i# J* {. C. ?, z+ Q 8 7 00011000 _TM_GetYValue@4
0 Y: f) G& N5 k# L9 l2 J 9 8 00010E10 _TM_OpenDecoder@8
, |0 S7 e* } j& z1 h h: ?( u 10 9 00010F30 _TM_ReturnType@4 5 F; Z/ F) |' K5 g
11 A 00010F90 _TM_SetFileEnd@8
8 G- P n- ~1 `5 n 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
0 ] T B) ]& U( [2 z! K 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
: s' X7 \' c+ ] 最后形成.DEF文件如下:
$ g: C* [- u+ j) N& Z5 i- L LIBRARY "VideoDeCoder"
8 O1 t m! E8 \$ i: N7 Y3 f DESCRIPTION "VideoDeCoder library"# u' w+ k, s: A( I- \
EXPORTS2 o- ]: z% J6 W2 j) \4 ^
8 ]3 E, n6 N6 Z5 [" G TM_ClearDecoderBuff@4 @1 " H; {# j! L7 M8 g9 A9 o
TM_CloseDecoder@4 @2
- D/ y" K3 C" D ]/ K( { TM_DecodePicture@4 @3 5 t" Y: Z$ d' M0 u! K9 O
TM_DecodePictureHeader@4 @4
' ?$ z- a) r3 A) `# X/ m+ r TM_GetFileEnd@4 @5
8 m4 a. W) K4 O3 J) g; [ TM_GetUValue@4 @6 & _' W/ B: ^6 B7 G5 F
TM_GetVValue@4 @7
+ b, v7 ]; ~- R( F% V. e g TM_GetYValue@4 @8 0 g/ ~: q4 {; |- x0 L
TM_OpenDecoder@8 @9 4 `6 W$ I. b; ?1 _; V
TM_ReturnType@4 @10
, h" F( {8 _" i8 k! N! W2 v$ t5 } TM_SetFileEnd@8 @11 1 z8 J* Q6 V" A
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.4 Q( i+ h/ B" D6 |
EXAMPLE:
) {( H3 W% m5 Q9 e LIB /DEF:VideoDeCoder.def /MACHINE:IX86
" ]2 V7 s3 y \& K4 B- q4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:, [7 ? C6 j. y7 Q0 g# q( I! Q
error LNK2002:unresolved external symbol "functionname@nn"
5 A+ `. d6 B' q! T( u# o提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立3 b7 Z/ _5 J: P7 K: F3 D
LIB,重新链接即可./ P6 J9 Q$ @5 y$ c* R
" C0 p4 D; Z2 G" Z/ D) g4 i
这样就制作成功了符合VC调用方式的LIB了!
( O* l% B% d/ ~4 D4 {# e参考:MSDN2000
/ O# B. ^& d- d- {, b要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
4 ]6 b7 R5 y8 u# F, f% _IMPDEF xxx.def xxx.dll; Z; w/ n: x4 n
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
3 a2 T. M h6 Z( v" C; a而在C++BUILDER中!
/ W9 a, M9 R* c1 E0 T: z__cdecl的函数输出前会带一"_" N3 C/ v& c4 j7 n7 n
__stdcall无特征,只输出函数名3 v$ q5 D" f, Y$ {6 B
__fastcall函数输出前带一"@"
/ W7 S l/ ~) ^& X( |都无"@nn"后缀格式!1 J0 V6 n' \+ `: v2 g
在VC中!* |4 }" h9 b2 T1 t5 H
__cdecl无特征,只输出函数名
3 W/ ^5 ?" |$ p: R* z# M U__stdcall的函数输出前会带一"_"后缀带"@nn"2 M; a; U, Q5 U7 F4 `; m+ }
__fastcall函数输出前带一"@"后缀带"@nn7 T6 l5 @* o/ h! e3 [: c
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|