|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!8 }1 m# x3 w$ x; @( A
/ x6 ?7 ]* W3 V1 l$ q1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
' C' G% a/ m1 R EXAMPLE:7 j6 o/ l; g3 E5 A- R. @5 U' y
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def. c5 R1 h" O+ D5 ?, c0 I9 m
$ R5 i' a$ k) A; s! D/ ?: t% e
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
+ o* F9 G/ {9 U& i4 ] EXAMPLE:
( \7 V) o) P* [- K" p( e3 F8 i VideoDeCoder.DEF 文件内容如下$ n/ ]1 j+ Y1 [
$ F0 F b, B# c* X1 _: h7 } Dump of file VideoDeCoder.dll
+ p0 ?% m0 A& C! m( _ ' ~" `' g7 ]1 ?& x+ b- N6 \$ c- A
File Type: DLL 9 d6 L( W0 c* D7 L$ h5 b1 C; v% N
* c) a, Q; N z( a' U
Section contains the following exports for VideoDeCoder.dll
- v* S* j# ?* @* a / A* }& }! z" @4 t% q1 J, } n0 V1 u
0 characteristics $ r$ D- q, p' y' f! r* E3 L4 n
3D49E48F time date stamp Fri Aug 02 09:46:55 2002 " { ^. V4 C( F" ]' c
0.00 version ; m6 ~; O& |2 Y7 i' h- c
1 ordinal base 8 V" S$ v9 D" {$ g9 l P5 `$ f2 w
11 number of functions 7 O% C+ K" D9 a9 f7 z+ W9 B" p: e
11 number of names ' `! q! t% I0 E
0 A% Y0 v5 | i. Z ordinal hint RVA name 7 s* E6 |$ Z% w5 g- | v6 g8 x# ^
; }0 t* r$ h6 ~' W P; j) p
1 0 00010F60 _TM_ClearDecoderBuff@4
$ B) J4 z2 l. {6 J' n& O* z, l9 @' a 2 1 00010E80 _TM_CloseDecoder@4
4 M/ @' Y6 j M6 `! E w 3 2 00010F00 _TM_DecodePicture@4
' J6 n. q y$ }+ D5 }7 O( ~ M: |$ m 4 3 00010ED0 _TM_DecodePictureHeader@4 # a, E+ c5 ~9 r- e
5 4 00010FD0 _TM_GetFileEnd@4 . t8 h" h: W( Z9 C
6 5 00011030 _TM_GetUValue@4 2 K/ F7 r( b! p4 D+ X! _
7 6 00011060 _TM_GetVValue@4 ' |# `% U! b. e( I, A, b2 P1 n/ C# R
8 7 00011000 _TM_GetYValue@4 2 _7 h r j4 g( Y+ H. G
9 8 00010E10 _TM_OpenDecoder@8 " e8 F! n+ h! B" c( m+ B6 G7 s1 B
10 9 00010F30 _TM_ReturnType@4 & q$ K( V0 W* x, d# T6 y5 g
11 A 00010F90 _TM_SetFileEnd@8
3 A. E4 R( a" m ' t) b ]0 m% C; u! a
Summary
2 F! U0 R$ U8 F ( B( E- f; V$ E$ z
2000 .data
5 q* G# C4 U. T. {- b( D 1000 .rdata - S. _; [ }2 C- Y. d" w
1000 .reloc 1 U& d( ^3 W7 [" m0 ~7 o2 f
15000 .text * J) L$ l: h: n r
按照以下方法整理:5 @2 m" ~) i" x# |4 j
1>添加LIB说明4 d6 q# i7 g- R; d d! U! `' a; @
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
/ e4 A. i/ R# K8 X6 C$ ~+ f DESCRIPTION "VideoDeCoder library" 9 A' h+ g) b" v6 Z% b
2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
5 s8 ?* g( A5 l1 ]: ^ LIBRARY "VideoDeCoder"
# J7 o4 |+ y9 i7 [* ?! d DESCRIPTION "VideoDeCoder library"% m& [& p* K: _5 X
EXPORTS
0 u' y( Y$ Y1 u; s* ]7 Y N ordinal hint RVA name
) E- a1 k, q$ W3 u* Z9 E) Z 1 A7 @; u( | q
1 0 00010F60 _TM_ClearDecoderBuff@4 & d! E1 H$ P0 X! B
2 1 00010E80 _TM_CloseDecoder@4 ) v0 I% o" L# a& V) R6 S
3 2 00010F00 _TM_DecodePicture@ : C0 ?. j- z( d: _
4 3 00010ED0 _TM_DecodePictureH
T( T7 }% Z" ]) s6 S: ^ 5 4 00010FD0 _TM_GetFileEnd@4
# k' t/ ?. S4 K7 v/ V 6 5 00011030 _TM_GetUValue@4 0 `' B3 `$ {; y" g
7 6 00011060 _TM_GetVValue@4 m* L! ^. j3 z3 p5 D0 u
8 7 00011000 _TM_GetYValue@4 ' Z9 D1 D8 f) f4 P, k/ k
9 8 00010E10 _TM_OpenDecoder@8
5 x- x" q, x- j7 G 10 9 00010F30 _TM_ReturnType@4
, {6 M3 P- R1 p/ M) u) j, x 11 A 00010F90 _TM_SetFileEnd@8 ! f7 _( n* K# b0 P6 l) y" m
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
# l# c; l. `9 P# C& m7 t& K 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
& ~+ {, }. n3 O( ^ 最后形成.DEF文件如下: Y4 b. Z8 z$ I$ c( {
LIBRARY "VideoDeCoder"
' g/ M7 I$ k/ {: _* B DESCRIPTION "VideoDeCoder library"7 D2 p1 ^1 C% e
EXPORTS
8 _! W( A5 j9 s1 @9 D' F - v. Y3 U4 S5 S
TM_ClearDecoderBuff@4 @1 % X1 Q' |0 T* S/ c6 F7 w% O& X- m1 S
TM_CloseDecoder@4 @2
) B- @( m. y4 \, f, _# G- l TM_DecodePicture@4 @3
7 z# \+ H# k) z+ O2 J' P. a TM_DecodePictureHeader@4 @4 ! c# e% }, Y# P5 S3 n$ R( e8 }
TM_GetFileEnd@4 @5
$ `6 W& [6 J R, D) {: K9 q3 w4 X6 B TM_GetUValue@4 @6
* d8 Y/ i: j/ j TM_GetVValue@4 @7
' h2 p2 ~/ c5 O) B TM_GetYValue@4 @8
9 j0 \4 C6 ]+ `+ N TM_OpenDecoder@8 @9 7 H8 E+ \. x: |3 }! c
TM_ReturnType@4 @10
; [' U& L7 U( g! ?# \% l4 |, @8 P TM_SetFileEnd@8 @11
& g8 V$ W; B% V. J3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
' {" l2 o- P/ Z1 U! l. j( W8 b EXAMPLE:
. L* P4 X0 z: N5 b* A' B9 J: L LIB /DEF:VideoDeCoder.def /MACHINE:IX86
# ~' c9 z; m8 T- q$ r) z3 d4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:! T j3 L T- R. t4 q7 L( c3 f
error LNK2002:unresolved external symbol "functionname@nn"
b" d/ w' g8 D7 y提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 ^, d. K4 {7 g: p
LIB,重新链接即可.0 q+ P' c) V, E6 Z/ `! q
+ H$ X$ O1 M( O" G# P
这样就制作成功了符合VC调用方式的LIB了!
7 w: T9 e" U- f$ r& \2 h参考:MSDN2000 D# u0 H: K8 s# q; W7 h
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!, X% l: l4 Q8 `$ b2 b$ ]3 e
IMPDEF xxx.def xxx.dll8 I* Y4 _, ` _. e7 m
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:) f2 Y0 L# U7 a2 |% Z" e
而在C++BUILDER中!7 z/ m2 M% x4 g
__cdecl的函数输出前会带一"_"
' _, F1 s& R0 C1 \; O( N__stdcall无特征,只输出函数名
) @: d5 A" M5 K! n2 O) ?9 N: d__fastcall函数输出前带一"@"
d. ?% T2 `4 w7 a都无"@nn"后缀格式!! g+ }7 Y5 q4 }! w2 f
在VC中!4 |) n" p) P$ i% q3 [5 @, W
__cdecl无特征,只输出函数名6 ]6 j: W c: Y9 U) s/ `
__stdcall的函数输出前会带一"_"后缀带"@nn"
+ r! L& J% L4 w9 b" I# s. U# n__fastcall函数输出前带一"@"后缀带"@nn( w; n( ~7 _$ |
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|