|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!7 h: T& r5 C. g* i8 T
" ?' z; a: o% V4 B& B% r3 {6 _1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件% \4 O9 }; g, g
EXAMPLE:0 T/ Z, Q' X0 v& o
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def/ Y7 S1 K8 T: c2 o. x
( r7 A+ |: F0 Y2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
3 W* m% o1 {. I' B EXAMPLE:$ r- R: k% i( `5 {5 e7 c! Z/ m
VideoDeCoder.DEF 文件内容如下& _& a, G& O. R
4 I: H5 ^. s* B0 s9 [1 w" c* ~# f Dump of file VideoDeCoder.dll
7 L. Z& G- L' R' E5 X+ k( W
$ W- ~2 W6 [# X- I, E File Type: DLL , i9 ?8 Q; j0 J( [1 a4 e: y! c
5 O- w/ I6 C! i% P" N& d
Section contains the following exports for VideoDeCoder.dll
' G; f: T8 [. {% |6 u/ w4 _6 c
" b1 Y9 F: h7 d0 q0 a* u f& R" d% L 0 characteristics - N2 f9 H# G( M+ }& k: V
3D49E48F time date stamp Fri Aug 02 09:46:55 2002
% O) `. p" p, y' V1 |6 e 0.00 version
* @' H! ^% E& q, ` 1 ordinal base
7 P" ~3 |# m/ @' x* P 11 number of functions
- Y5 o6 k: W( T6 R+ ?8 [6 N# a' Y 11 number of names
6 w" F# u+ s" b9 ^" t4 V 9 U0 l7 v5 F! Z S5 ]% d
ordinal hint RVA name " Y/ ?1 ~0 D0 D
6 Y$ I {9 O- o J 1 0 00010F60 _TM_ClearDecoderBuff@4 + \5 X: A9 N- T! F% L3 a$ y7 F
2 1 00010E80 _TM_CloseDecoder@4 ) G+ @+ `+ c/ V3 s9 }* c! p9 z! I G
3 2 00010F00 _TM_DecodePicture@4
: ?% c" T: H; b 4 3 00010ED0 _TM_DecodePictureHeader@4
, R" t" h% Y6 z- @/ [' ]2 R! G 5 4 00010FD0 _TM_GetFileEnd@4
. [ A" ]7 K5 G: { 6 5 00011030 _TM_GetUValue@4 1 l/ J6 _% [8 B9 \0 h) X: `% n
7 6 00011060 _TM_GetVValue@4
3 E& j+ G, F" n2 h/ K 8 7 00011000 _TM_GetYValue@4 * f7 Y/ N( Z6 W
9 8 00010E10 _TM_OpenDecoder@8
; u; ]$ n- P3 V2 F$ h$ D 10 9 00010F30 _TM_ReturnType@4 . j5 r; \0 ]1 g/ r e, x: u
11 A 00010F90 _TM_SetFileEnd@8 * e; Q- O- V6 l, B* T$ t5 `
& `. P; |0 C$ v* n$ I2 |) T# t* y Summary
. @. T1 h3 I6 t' `3 J8 }4 a; S
& f' q9 `0 t. N0 L 2000 .data * V9 ?. Z; e8 [* w# n0 H8 j1 V
1000 .rdata . n# @3 A# ]! u0 ?
1000 .reloc
; i7 g6 t. u+ x; w 15000 .text
' h5 x7 s$ F% K1 O0 d; |% o 按照以下方法整理:
& ?& g' Q8 L) h" {- \ 1>添加LIB说明0 q3 k2 E+ I: j/ X
LIBRARY "VideoDeCoder" ;"xx"为DLL名称* m( Q! V) ]; Z6 l' d% l z/ E& ]
DESCRIPTION "VideoDeCoder library"
* |8 L5 ]% D9 I# k" ^$ q 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数% Z% }, O* [, l
LIBRARY "VideoDeCoder"
" E0 K) Q. M3 R% Z( U% | DESCRIPTION "VideoDeCoder library"
2 l$ G4 K$ N* w! f0 b EXPORTS5 H: \- D6 E4 Z% s6 p
ordinal hint RVA name
7 {9 v, [4 ^; q, K( |4 ~4 _9 D 6 S. E1 L9 U8 y, m+ F
1 0 00010F60 _TM_ClearDecoderBuff@4
+ |4 u& R& t# c, G' m7 x/ z9 ] 2 1 00010E80 _TM_CloseDecoder@4
, L2 h1 i! a" w0 p' i/ b 3 2 00010F00 _TM_DecodePicture@
7 ~( _8 j, g8 _ 4 3 00010ED0 _TM_DecodePictureH 2 F- u: {. v% z% i$ O( X
5 4 00010FD0 _TM_GetFileEnd@4 9 [ c& K% Z5 _% ]+ m, n
6 5 00011030 _TM_GetUValue@4 % W; s/ N$ C( O3 |! H) N7 B% {* {
7 6 00011060 _TM_GetVValue@4
* h& b8 K+ M5 W1 T9 x ^; j+ c7 f 8 7 00011000 _TM_GetYValue@4 5 P( U+ @. Y# m+ Q$ R9 K
9 8 00010E10 _TM_OpenDecoder@8 3 b4 d$ o- V1 {+ {7 X8 H
10 9 00010F30 _TM_ReturnType@4
k$ ]- m ]& @8 a( P2 M. ^" Y 11 A 00010F90 _TM_SetFileEnd@8
/ G# F) A1 n) O1 x) m1 E 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号# B& ?5 F; _+ W8 s. D& g3 d
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").$ P+ b5 ^3 `7 s& j
最后形成.DEF文件如下:
+ a1 r6 ~6 Z! X) I5 S LIBRARY "VideoDeCoder"
2 _5 [' ?/ X% [& \# ]9 B. i5 o DESCRIPTION "VideoDeCoder library"- \2 X0 E# j3 t B
EXPORTS" j5 T. `' t4 w0 L: d- y- j9 b
) c( A5 [# w0 J& |; ^3 T TM_ClearDecoderBuff@4 @1
1 m$ E2 r5 a1 _8 D5 p TM_CloseDecoder@4 @2 & H5 _6 f3 _# C9 \+ W
TM_DecodePicture@4 @3
; a2 s3 T0 H( R* F; y( {: k/ P7 x TM_DecodePictureHeader@4 @4
: h+ D( s- k4 ]. ` x TM_GetFileEnd@4 @5 ) W' \. M& q5 u% {7 D& s
TM_GetUValue@4 @6 4 G" M2 r) p+ e$ r; c3 P2 T4 Y
TM_GetVValue@4 @7 , t, B+ W5 j" w: q) O: k
TM_GetYValue@4 @8
/ s) e( ~, q- M- P7 u TM_OpenDecoder@8 @9 % X% t, Q1 a4 o- v" b1 L5 n
TM_ReturnType@4 @10 0 x$ ]8 U2 T, g' a, z
TM_SetFileEnd@8 @11
1 w! ?. f. q4 _. m% m3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.; m) V& f$ q2 t4 x
EXAMPLE: Q/ z f1 [0 v1 l h
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
0 y$ G" L& g0 |/ N0 @4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
: v) p: |3 s4 V' [8 f: l7 {/ J error LNK2002:unresolved external symbol "functionname@nn"
# `, n& B+ N0 r7 v( J6 c7 u/ I3 t提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 Z" U8 p5 Z3 l# t/ Q! G
LIB,重新链接即可.
/ Q( g: C! z8 ]7 j( C, F+ D- o; R5 I8 X' k3 i, I9 g e
这样就制作成功了符合VC调用方式的LIB了!
! N& G, ?" V: p3 e参考:MSDN20005 \8 G9 [4 D6 t) ^
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!: V5 t* v; _& A# o5 d: }' e
IMPDEF xxx.def xxx.dll4 |- W; H; C3 B* e+ g
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
- Q) M5 m% K0 S% ]而在C++BUILDER中!
0 u6 b* W4 O, V' T- f__cdecl的函数输出前会带一"_": o8 t# X/ f& {' G1 o& U+ g8 e
__stdcall无特征,只输出函数名
/ J& c6 E" c0 w Q: S; N2 r__fastcall函数输出前带一"@"' e: S$ W% v v6 T( q' A
都无"@nn"后缀格式!6 ^ B4 A6 Z* z: f( S: L
在VC中!
2 D' p: k/ J4 B, F__cdecl无特征,只输出函数名4 A% Z1 `( c" l# |$ r- M" }: W8 `
__stdcall的函数输出前会带一"_"后缀带"@nn"0 m5 b+ o7 k: n' F: C
__fastcall函数输出前带一"@"后缀带"@nn% d' L/ I( n" |. o, z
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|