|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!3 {- W. v) ]1 b6 Z% m! C
* }' [5 v" Q* E6 v. h8 {% C
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件& M: l9 F( r5 m4 L; j0 {5 G
EXAMPLE:6 S1 ^% {$ ], Y; }. W
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def! u2 V s5 o4 Z* |, p
; C- ]7 `8 y$ N, X" n! z2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
" f% H: @! s, p; X EXAMPLE:8 D& E# G+ L! j+ p
VideoDeCoder.DEF 文件内容如下
3 u8 J, O2 B7 M3 M6 d
4 ^ q9 M$ N0 M9 Q, Q Dump of file VideoDeCoder.dll ] B+ p- b$ l& M1 }
7 ^7 t5 S# Z* q. r+ d- [2 f7 u$ b
File Type: DLL 6 O% h: ~! y# ?2 f' u( V
: G5 B4 X' q; Q4 x1 t6 c W5 H Section contains the following exports for VideoDeCoder.dll
% i3 Q9 Y% b4 k: m
3 U4 T( z0 s9 r& k8 U. g 0 characteristics 9 Z& |( k( _& C; T4 c) ~
3D49E48F time date stamp Fri Aug 02 09:46:55 2002 & w: t( |% y( l' ^$ {, A! I5 b4 c
0.00 version
5 d l) k4 T1 j* h" O 1 ordinal base
% F: K+ Q# Y& h- Q2 h 11 number of functions 6 H, E( Z7 q' ]7 n' j
11 number of names
8 i* F0 g$ l7 X% B$ O ; U* C/ I6 S0 I- x: d& }/ G* @
ordinal hint RVA name
q9 v! k& @. [9 m! o& [ # T& S2 g* Q1 R) h
1 0 00010F60 _TM_ClearDecoderBuff@4
5 t/ K& {, _! a$ h" ^8 s 2 1 00010E80 _TM_CloseDecoder@4 ' j+ R7 j0 A7 \* b
3 2 00010F00 _TM_DecodePicture@4 6 `7 @4 y& Z# Y9 d: M% D2 p
4 3 00010ED0 _TM_DecodePictureHeader@4
: u6 {5 Q7 q: ~- ?6 A2 { 5 4 00010FD0 _TM_GetFileEnd@4 8 \$ T, [ a2 f \, b9 z
6 5 00011030 _TM_GetUValue@4 9 H5 h6 A- O8 P0 ]
7 6 00011060 _TM_GetVValue@4
5 M1 v- e4 q3 s1 R3 z) m8 } t 8 7 00011000 _TM_GetYValue@4
9 S$ m! f7 \8 i. m 9 8 00010E10 _TM_OpenDecoder@8 2 l/ C6 K3 [$ Y. u1 F, T
10 9 00010F30 _TM_ReturnType@4 ) c3 z) I, @5 b6 T: M
11 A 00010F90 _TM_SetFileEnd@8 ' e* |' ]+ Q* k* b. ~) V
9 L; B% w1 k3 B" o3 c Summary
. x S- w" W& k& {5 v4 f9 j
. C# F/ `2 R& ^9 B 2000 .data
8 G3 u4 ^: l! }$ o& ]. G 1000 .rdata
+ ~. v6 A5 [8 n 1000 .reloc 1 D0 F% H! @) m1 d% d
15000 .text
% D( e& V4 ?. z 按照以下方法整理:1 `( u5 y/ l& i6 r
1>添加LIB说明
* |3 p+ w# Z2 v% [8 A LIBRARY "VideoDeCoder" ;"xx"为DLL名称! j+ d7 {' F# r4 A, z E
DESCRIPTION "VideoDeCoder library"
8 C; {" w3 M7 @% h M* t 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数; c% t3 P, c9 \4 h
LIBRARY "VideoDeCoder"# M2 F6 m5 M+ E, U" q$ d
DESCRIPTION "VideoDeCoder library"
' b) C" K6 c8 G: d EXPORTS$ p) X- W' a, N2 B* s/ @% ^
ordinal hint RVA name , y* o& Y* J5 y# w
5 |6 C# F: ?* h% z' B. Z4 A 1 0 00010F60 _TM_ClearDecoderBuff@4
" A; L+ T' o& t 2 1 00010E80 _TM_CloseDecoder@4 & n: U3 e& z. p9 x; `' ?( J
3 2 00010F00 _TM_DecodePicture@
- |. i& v7 G3 U 4 3 00010ED0 _TM_DecodePictureH
$ t! [+ n F: Y 5 4 00010FD0 _TM_GetFileEnd@4
- L- I! I6 l. s" W3 t- Y e% h: V' p5 ` 6 5 00011030 _TM_GetUValue@4
/ n% n5 \' s& q8 N8 W+ Q0 T i 7 6 00011060 _TM_GetVValue@4 + C1 s2 H# n" g: h o& E a, e
8 7 00011000 _TM_GetYValue@4 6 X7 J& I: N! ~ V) }* K
9 8 00010E10 _TM_OpenDecoder@8
" ~ Q- C p+ G: C& T1 X9 P! X 10 9 00010F30 _TM_ReturnType@4
+ g+ k) D% T2 c 11 A 00010F90 _TM_SetFileEnd@8
2 e4 Y6 G# ?7 P! i9 p 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
6 U( [) p( L2 B' N5 k/ W6 o 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").2 N/ P5 W% E# c
最后形成.DEF文件如下:
; s" q; D/ O2 \6 n9 `+ B LIBRARY "VideoDeCoder"
7 B' g# A7 o8 H: B, D! N, O DESCRIPTION "VideoDeCoder library"' F) _$ k* N! N- L% n. } \6 E+ ?2 k
EXPORTS
* k; q( p5 ^* f8 Z$ _$ q: N
3 O8 y' K* H U TM_ClearDecoderBuff@4 @1
\! |9 u$ a1 r! T( y3 ~8 A6 r8 C3 L TM_CloseDecoder@4 @2 ( H- o$ a0 b, o
TM_DecodePicture@4 @3
: e" h% p( }3 d" F TM_DecodePictureHeader@4 @4 ( J7 S8 f9 y7 E7 r
TM_GetFileEnd@4 @5 9 |$ q$ H0 o# g, P$ a. f% a' {
TM_GetUValue@4 @6 8 ^4 ]# _6 q$ D; Z
TM_GetVValue@4 @7
1 V. M+ B6 k) w TM_GetYValue@4 @8
1 }3 j/ ~! z/ Q$ {: r TM_OpenDecoder@8 @9 + v$ x: b. K& v V1 G
TM_ReturnType@4 @10
9 [5 c& W$ r3 L. X8 S TM_SetFileEnd@8 @11
; r, a Z% l- x/ n+ B3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.% P& t7 W+ B# m0 i1 @# i, c3 Z, n6 w0 \# a
EXAMPLE:2 t7 K) r, k0 y! ~/ {
LIB /DEF:VideoDeCoder.def /MACHINE:IX865 Q+ m5 z8 v- T* f. G
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:9 m7 X9 C3 |: G
error LNK2002:unresolved external symbol "functionname@nn"
! l5 E: d: {; r提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
& R- G9 G h/ FLIB,重新链接即可.) K$ R6 X6 q! v' H
- O- ]6 r6 Q8 |- x
这样就制作成功了符合VC调用方式的LIB了!; r+ r0 F% D* z: n3 O" W- m, J
参考:MSDN2000
: Q5 V8 `! Z+ a# Y" Q) {要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
B; j* @* A: O4 y' `% M! SIMPDEF xxx.def xxx.dll7 U) [# r5 P: W2 u! K/ r5 ]/ H
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:" l7 ]+ T/ T7 O' W: ^, W8 M
而在C++BUILDER中!: j% S) K1 w4 b }" A& x" w
__cdecl的函数输出前会带一"_"
+ e0 B5 w1 p9 J! t$ A) i8 M) S__stdcall无特征,只输出函数名
# |! }# p- `: t& P- B7 R! E__fastcall函数输出前带一"@"3 h9 X' ~5 ~, K3 o. N7 \
都无"@nn"后缀格式!* o% E. |$ Z' m2 r, ~! M" }- T
在VC中!1 W' O( T1 N, P6 d) C. i+ O
__cdecl无特征,只输出函数名
+ }8 e8 b6 E0 X" l" w9 ?* k4 z0 [/ }__stdcall的函数输出前会带一"_"后缀带"@nn"
5 n9 C! v1 U3 r) i- a$ D__fastcall函数输出前带一"@"后缀带"@nn
# ]" T4 e0 [- `- L3 a( F只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|