|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
6 r: b8 h/ o; n' i3 F2 \$ j* x0 t& @: S* N
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
! X. _6 Y O; a# s- o EXAMPLE:
. z% N- K; u j; K8 V5 Q9 I DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def0 O+ e( _6 f1 p- N/ w
# {) s0 A7 b2 V/ Z% V) `2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件- X1 H2 K, x2 g* s
EXAMPLE:
. _# n! p) O9 ]8 }4 N7 X3 c VideoDeCoder.DEF 文件内容如下
* e; q/ q) O, N) h5 s8 A
0 e$ o5 Q. F" c* w) G# |7 b Dump of file VideoDeCoder.dll
; C6 C1 i2 `% r9 ^ # Y& u2 G* e* A- E# W) d( Q
File Type: DLL ) s1 B' P8 p) w+ u3 D* ?7 b* S1 F. \
7 z' {1 _' x: Z( u$ F9 n Section contains the following exports for VideoDeCoder.dll
4 ~" F* _- T% M H6 F% Y7 H 6 z$ s$ n1 u: T
0 characteristics
0 a4 O- K$ k7 H 3D49E48F time date stamp Fri Aug 02 09:46:55 2002 ' [; z5 k5 Z; b
0.00 version
. I4 m Q5 T7 ?' H+ y& A 1 ordinal base
) V7 m+ o9 _: L- U' \+ z 11 number of functions * P X, q4 I+ E0 w2 t% ^+ z
11 number of names
( t2 @ X) F6 m* l5 h6 U7 ^$ C
; s1 o+ L1 x; ] ordinal hint RVA name
/ @8 d8 ]1 e( |$ G% I1 M
1 W" V- ~) O, R9 D 1 0 00010F60 _TM_ClearDecoderBuff@4
4 _) S+ N: _2 l- O( D+ F6 @- Q 2 1 00010E80 _TM_CloseDecoder@4
- C* T9 r* B+ Q3 X& x 3 2 00010F00 _TM_DecodePicture@4 - V8 }/ h ?* B
4 3 00010ED0 _TM_DecodePictureHeader@4 8 r" ?/ d3 D5 t& A6 k0 v
5 4 00010FD0 _TM_GetFileEnd@4
, w0 K: a, D9 K( P 6 5 00011030 _TM_GetUValue@4 + ]2 R! e3 f+ G+ t7 l8 K
7 6 00011060 _TM_GetVValue@4
2 E1 A0 F9 X2 f4 P; F- P& n3 f 8 7 00011000 _TM_GetYValue@4 + v- _! z( K! M$ M! D) Y; R1 w+ q
9 8 00010E10 _TM_OpenDecoder@8 8 r/ x4 V J# N, G3 v+ @+ p
10 9 00010F30 _TM_ReturnType@4
# Q9 W# Q9 ^( V3 B 11 A 00010F90 _TM_SetFileEnd@8
4 A1 H4 B) q/ X% s9 X 6 _. E/ V' J9 {/ R
Summary
e5 I. h1 p% Q$ Y, h
# V! Q$ Z; y9 p) X) D* S8 X6 W4 ^ 2000 .data . u( b/ \7 U9 Y; T
1000 .rdata ) Z3 s& O# ~$ @$ n8 G3 Z( F- d4 I
1000 .reloc 3 f9 ~3 f% G E- C8 A1 f
15000 .text
; D( ]9 I: B) C) w 按照以下方法整理:3 K# L- T9 k9 I7 B, I5 M
1>添加LIB说明
% M0 Y+ u2 j. W. b- d7 _" n, g LIBRARY "VideoDeCoder" ;"xx"为DLL名称0 L, M2 r9 n8 ?( t! [
DESCRIPTION "VideoDeCoder library"
7 T! ]& `% s6 x 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
1 m4 P2 |, T4 b+ S- d i' {* P! g LIBRARY "VideoDeCoder"
5 d' [, D+ g/ i* K' Z7 z DESCRIPTION "VideoDeCoder library"
4 g; E! ~: H* ^+ f' L7 C+ m( a EXPORTS% l) \. h4 f* B
ordinal hint RVA name
4 b9 J; e o g( `5 l
. G* {/ @0 o% R& U* x0 @" {( n; f4 O 1 0 00010F60 _TM_ClearDecoderBuff@4 ( ]' Y) _' q2 n9 i
2 1 00010E80 _TM_CloseDecoder@4
5 g2 j! \! p. s; ~ 3 2 00010F00 _TM_DecodePicture@ # E2 u2 G& q: A# ?# |
4 3 00010ED0 _TM_DecodePictureH $ R. [2 O- G, h* ^
5 4 00010FD0 _TM_GetFileEnd@4 " d+ h+ [* y. Q' k2 C$ z
6 5 00011030 _TM_GetUValue@4 ( {7 h$ Q4 ]2 H7 e
7 6 00011060 _TM_GetVValue@4
& Y+ \5 o3 P$ t 8 7 00011000 _TM_GetYValue@4 0 K5 \/ o( a6 G- \* T3 N: }
9 8 00010E10 _TM_OpenDecoder@8
" j% G- w7 R- R: y 10 9 00010F30 _TM_ReturnType@4 & ?, l5 r0 _: b& {
11 A 00010F90 _TM_SetFileEnd@8 - [9 L& u' X9 x
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
( w% f7 B3 u! c( y2 Y9 Y 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
% M1 @! n7 x0 Q. J, u8 P! b$ d 最后形成.DEF文件如下:* |) f$ h, i6 n& p* l5 J" t
LIBRARY "VideoDeCoder"
* T' V' D4 \( h9 Z3 W DESCRIPTION "VideoDeCoder library"
: @% z; @4 ], O. ` EXPORTS. D; X6 {5 R0 a8 [5 e
- `, W' e0 A% m7 |- F" X; R TM_ClearDecoderBuff@4 @1 . T% ^' t/ ]& L/ |8 k, S; p
TM_CloseDecoder@4 @2
2 d, P8 V+ h. k$ n' q) G/ C TM_DecodePicture@4 @3
# X I1 k& \7 s4 Y/ [8 Z TM_DecodePictureHeader@4 @4 5 B' a: N" w6 ?
TM_GetFileEnd@4 @5
4 [$ k5 n* D4 e$ T9 r TM_GetUValue@4 @6 - ~% l+ B5 t7 g5 P
TM_GetVValue@4 @7 7 G: [ _" J2 q& X1 o" u5 x
TM_GetYValue@4 @8 2 r% k+ \; i4 J
TM_OpenDecoder@8 @9 2 R% `. b% ^3 h, _; w
TM_ReturnType@4 @10
2 G# B) I4 r- N$ v+ {6 H7 U TM_SetFileEnd@8 @11
# m& K* D: Q; K/ O" W, E3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
. p7 \5 a. z. X m* B! ^6 \; B+ P8 G EXAMPLE:
1 `% _( P1 u# n0 [6 N LIB /DEF:VideoDeCoder.def /MACHINE:IX864 b8 ~5 w8 G7 I6 P9 f$ a
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:+ I4 {+ ?; @4 W! t3 |& ?
error LNK2002:unresolved external symbol "functionname@nn"$ p1 r# R* P" _# h* m
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
" s$ q t1 D% ~; I' PLIB,重新链接即可.+ j- X- O; N2 Q6 k) m+ _4 o
5 U" H" c3 J0 t+ p* h2 ~6 [- d5 A
这样就制作成功了符合VC调用方式的LIB了! L& g3 u/ E5 I" l
参考:MSDN2000/ \; c1 {8 ]: L; C1 U- @
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
$ d/ ?& ^ U* O/ g+ ?& }IMPDEF xxx.def xxx.dll. V5 J* U9 o1 V- ?3 @2 C
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:8 L8 U4 i* u( q5 V2 N/ O
而在C++BUILDER中!6 E( `* x* v3 h h
__cdecl的函数输出前会带一"_"9 A0 }) |* Z7 R$ `* s
__stdcall无特征,只输出函数名9 L# L5 t9 T, C" J
__fastcall函数输出前带一"@"2 ?( D5 w( p% R, s
都无"@nn"后缀格式!
$ E/ Y! y; b% n2 I2 c在VC中!# j8 J9 q$ @+ u! r9 z1 L, z
__cdecl无特征,只输出函数名 M+ q) d% \8 h( e% A, W1 m
__stdcall的函数输出前会带一"_"后缀带"@nn": |3 Y' x/ t9 ]4 v1 f
__fastcall函数输出前带一"@"后缀带"@nn
- B# `# P2 F1 d) n* ]2 @* R只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|