|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!* O! \6 `7 F2 B# x: `
9 ]: H0 B; U" N( V4 n; R1 L
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
3 \$ D4 ]9 b) n) i" k5 c EXAMPLE:
2 B; v( ]. H6 w2 B# T# S DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
0 C. j2 l1 M2 f! N0 Q2 y9 E
0 n: X5 B0 N. B! Z0 X9 ^/ w2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
0 l% J' |$ N( X9 d3 Z EXAMPLE:3 e0 s$ i) n$ A0 \
VideoDeCoder.DEF 文件内容如下: V/ t/ k- z; p8 e# Y
7 ~0 b# W1 V. z Dump of file VideoDeCoder.dll
' Z6 m0 K- x5 a0 X% h9 l, [ 0 H4 m& Z' i! L; T
File Type: DLL
3 t2 V- Y& x {& U, T ! ^! H* X {; B. a
Section contains the following exports for VideoDeCoder.dll 4 i) T+ p8 e+ s7 c0 P
# O( z+ g- O/ J5 D& U: U8 b/ Q 0 characteristics , m. G3 T/ E" y# n1 `
3D49E48F time date stamp Fri Aug 02 09:46:55 2002
2 X) [( b# X' y/ U 0.00 version ( ?' A: ?; B' j( k) c
1 ordinal base : W4 Z7 B4 N9 ~8 A8 U1 t1 z
11 number of functions
, B. u5 R6 l! z x 11 number of names
; O: @* j) J7 Q! V: W E9 A" O! ^5 \+ ]; g0 A% d( J
ordinal hint RVA name + ?8 r8 |$ F7 a- Z: O
* G0 x* c+ O$ J6 y$ h1 B# o 1 0 00010F60 _TM_ClearDecoderBuff@4
* V& f6 V) J9 Z+ Z/ @ q4 r5 M4 s( e 2 1 00010E80 _TM_CloseDecoder@4
5 |5 W4 A1 r8 ]) {# |) G3 Z 3 2 00010F00 _TM_DecodePicture@4
: G" E4 v8 e- j: T 4 3 00010ED0 _TM_DecodePictureHeader@4 ( Q8 S" ?! r' s6 `* }
5 4 00010FD0 _TM_GetFileEnd@4 0 }1 N! h. W1 g( Z
6 5 00011030 _TM_GetUValue@4
& V4 W' `- Z* f8 K" @( h 7 6 00011060 _TM_GetVValue@4
) Z z0 [" L) N 8 7 00011000 _TM_GetYValue@4 $ [5 W( D$ h8 R6 A
9 8 00010E10 _TM_OpenDecoder@8
6 S" w, D- t; |# m 10 9 00010F30 _TM_ReturnType@4
% c; @ j. D" ?. C t" V 11 A 00010F90 _TM_SetFileEnd@8
1 z B% l [( ~$ r
2 A, e; C, T% B5 Z7 D4 ~ Summary
$ |9 T- N; y/ D; p* ^
* d% l/ Y' S7 Z5 A 2000 .data
. P: ]" H; g8 [0 i 1000 .rdata
( H' N# P9 i! c 1000 .reloc
. H) ~: D3 L% _$ W6 f4 A 15000 .text 4 {7 O0 |! r( I7 U6 ^
按照以下方法整理:$ @' m& O& @) c( d0 N9 I
1>添加LIB说明+ T( _9 E9 a4 Q3 x8 F1 u! g
LIBRARY "VideoDeCoder" ;"xx"为DLL名称1 K, \. ^2 Q2 Y: F
DESCRIPTION "VideoDeCoder library" * G) g# v" M% ]* J/ X
2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
/ N2 ]! F) g2 a8 l3 r LIBRARY "VideoDeCoder"
+ V7 R, o5 Q* t4 r( n DESCRIPTION "VideoDeCoder library"
; z( j/ v& x5 h J3 _. U EXPORTS' `0 \3 X) Q* n- Z6 d( T" |
ordinal hint RVA name ! W5 `) D4 p! P% M8 g/ h
+ P8 y( \5 A' r3 Y, [! U7 m- |
1 0 00010F60 _TM_ClearDecoderBuff@4 / I3 x' @* U/ R% @6 ]
2 1 00010E80 _TM_CloseDecoder@4 2 @* z) I2 _4 T9 l
3 2 00010F00 _TM_DecodePicture@ . o, }4 ]! A" U4 I- c
4 3 00010ED0 _TM_DecodePictureH 3 x7 _8 r; y1 m5 m- o# z
5 4 00010FD0 _TM_GetFileEnd@4
3 }8 a7 Z3 U2 k& I* [6 v 6 5 00011030 _TM_GetUValue@4 ' f4 q" K5 v4 T/ e% S/ k
7 6 00011060 _TM_GetVValue@4 & y* E5 C: Q. N, A' A! O* u
8 7 00011000 _TM_GetYValue@4 # m4 |7 W+ A* j6 q+ @2 G
9 8 00010E10 _TM_OpenDecoder@8 ) |5 m" Q5 O" s9 x1 y0 |) |
10 9 00010F30 _TM_ReturnType@4 & r' h3 u0 m; ?' X: Y0 K: r
11 A 00010F90 _TM_SetFileEnd@8 / r( T- H* K6 ]
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号7 s* O$ T+ ^0 U c% h/ b( O
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").( c; I3 L5 H9 f7 x: g; f
最后形成.DEF文件如下:
- l' N# _; q9 C% T8 r) c LIBRARY "VideoDeCoder"5 H( ^) y7 g8 R* `0 K
DESCRIPTION "VideoDeCoder library"
2 w+ j& h- M( c5 W$ q EXPORTS& u$ A% r. k. ~& s( ?
/ ^2 \( Z6 x o( E# }1 _+ j
TM_ClearDecoderBuff@4 @1 B! h( _" s+ n) `9 d! ~
TM_CloseDecoder@4 @2 8 Q/ r6 t$ y2 S# |1 g
TM_DecodePicture@4 @3
& r: [8 C9 C7 q- I6 c+ \ TM_DecodePictureHeader@4 @4
9 T/ L; O0 M$ s; v) _5 ^( Q. q. J TM_GetFileEnd@4 @5 0 B1 K$ y- V; O7 k; X
TM_GetUValue@4 @6 3 V+ Q2 {. ^8 g1 j m {3 \: f
TM_GetVValue@4 @7
3 D& J. h k* D/ \ TM_GetYValue@4 @8
/ A; @7 ^; m# i1 u TM_OpenDecoder@8 @9
: e7 E- ~: E# Z1 J# G& B TM_ReturnType@4 @10 & @6 e3 P9 g5 p$ \
TM_SetFileEnd@8 @11
# }% S! H! e! J9 D- _% K- [) K3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.; G! B6 {) L! P% G' S
EXAMPLE: B( A. r" a+ \% F8 i8 N2 W
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
9 T0 M( @2 ~/ [4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
. P1 O0 B+ @# ?" c0 T error LNK2002:unresolved external symbol "functionname@nn": J( W, G" h# a& }: x B
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
3 F+ ]9 E6 V% V1 Y- MLIB,重新链接即可.
8 C& `2 l2 `4 v% ~. v
- M" ?/ _# ^5 X9 S8 Y9 K w9 v) ?这样就制作成功了符合VC调用方式的LIB了!
, G" v" o1 C/ U参考:MSDN2000
; c% x' ]9 z9 E0 ~2 a. ~: F3 T+ k要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
; M5 N, }- m [( w) P$ w% ]: GIMPDEF xxx.def xxx.dll
" Z8 A, a! B. r7 u+ j这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:9 ?3 L5 X0 E; R8 t' \2 }
而在C++BUILDER中!" F C( o2 i8 W" \- f
__cdecl的函数输出前会带一"_"
# {- o9 ?$ d' \. ]__stdcall无特征,只输出函数名% }0 }; Y8 f: y0 M
__fastcall函数输出前带一"@"
i9 }$ W% @; Y0 v' c, T都无"@nn"后缀格式!6 i% F4 R4 E5 Q9 l% ?+ F: o
在VC中!
& Y% b& p' _; V5 C" j9 I- |2 t [__cdecl无特征,只输出函数名5 X g$ ^5 q7 i1 g! L
__stdcall的函数输出前会带一"_"后缀带"@nn"
# d" G H( P5 q__fastcall函数输出前带一"@"后缀带"@nn3 [: z' S3 D4 S& d% T6 r. ~
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|