|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
% P' F( S3 `/ ]. `! O) w) H7 Y8 v0 }+ a+ j
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
) D$ ?% q j$ \4 N6 d( P EXAMPLE:
/ n ~% u. g5 r3 G+ U DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
0 M7 l5 W( z- j3 l( V3 G! A r, X2 \0 {# O
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件- N" Q1 f3 Z" |) N9 z
EXAMPLE:
, ^: n5 Z" C1 m$ ~6 i VideoDeCoder.DEF 文件内容如下
6 |9 N ^% g6 @+ @1 j+ i. @- ` " h. Q! g- A4 {# M; a# R' t E; D+ x
Dump of file VideoDeCoder.dll 5 k% e8 j6 t' Z c9 f# y, ]4 }' ~
+ ~+ ]4 A, _2 T* Y% { File Type: DLL
% s* {! n+ z( h8 Y' P
2 ^# T! i& m9 o! f. l9 {3 d6 z; n Section contains the following exports for VideoDeCoder.dll
/ i& s" E: L* `6 V; r
( N0 z# G! ^; s( J" P 0 characteristics
0 o3 v$ z( {7 K8 v" O 3D49E48F time date stamp Fri Aug 02 09:46:55 2002 4 D6 o1 c7 G0 {3 H! ^) F5 r7 B( P2 b
0.00 version
0 ^/ x% ?: A; X( `/ y- d" ^ 1 ordinal base
6 c1 D! a1 z7 u5 T 11 number of functions . w1 H% n0 @$ I) b1 b# T" z
11 number of names
- ^5 l1 b7 e/ j1 O8 A9 l w$ V, `5 ~: I2 H/ C* u& G- Z
ordinal hint RVA name
4 \ m/ {2 p6 d. {7 n3 y2 t t4 ~( Z- V& D- w
1 0 00010F60 _TM_ClearDecoderBuff@4 ! M8 K, z1 p- v* M7 t$ E
2 1 00010E80 _TM_CloseDecoder@4
4 }& k$ W/ s- g0 E! ^ 3 2 00010F00 _TM_DecodePicture@4 : v+ ~& E3 [" }9 \4 r4 s- E7 X
4 3 00010ED0 _TM_DecodePictureHeader@4 + o R3 I6 N% E |( I1 \$ ~
5 4 00010FD0 _TM_GetFileEnd@4
3 e' q: a K8 P( S% }# f% U- `: X 6 5 00011030 _TM_GetUValue@4
9 a* i' i4 k+ C. H 7 6 00011060 _TM_GetVValue@4 * ^' y3 H5 G$ w
8 7 00011000 _TM_GetYValue@4 ' R4 W! }3 U4 K. w
9 8 00010E10 _TM_OpenDecoder@8 / R `% b: @; G( _
10 9 00010F30 _TM_ReturnType@4
- D, {& g0 U# C P) O' r& v 11 A 00010F90 _TM_SetFileEnd@8 5 Z9 i5 M1 d, J5 c1 H: ?
9 s$ T/ t+ o( L3 \ Summary ( C" x4 U- c1 n# D
2 B% z( g' ]* j- [6 z
2000 .data : L+ [; n7 Y1 ?- Y
1000 .rdata
0 O, S Y/ R/ D2 b p% ` 1000 .reloc & M! N4 O O: A
15000 .text ' @. w0 Y( |! K. P
按照以下方法整理:
6 B# k" X5 z6 z) k: J9 A8 Y 1>添加LIB说明% T$ I' e( y0 q }% d* ?
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
; t( s+ h4 W4 F4 F! g DESCRIPTION "VideoDeCoder library"
1 R" h) r+ F4 `/ j" E% o 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数% F" B! r1 p4 u1 c! r e
LIBRARY "VideoDeCoder"
6 d) m$ l9 |; s# J2 J( p DESCRIPTION "VideoDeCoder library"+ q3 y2 n8 o& ^5 R# a+ ?& ^
EXPORTS
/ E) F2 k6 _. j ordinal hint RVA name ) c5 l8 |* i( x0 ~: Z/ \4 C* M
. `- I3 B# G6 V2 S
1 0 00010F60 _TM_ClearDecoderBuff@4
0 y$ E9 _+ x" o1 B$ k" J& } 2 1 00010E80 _TM_CloseDecoder@4
, a# L9 e v6 O: ]$ a 3 2 00010F00 _TM_DecodePicture@ # G9 n/ q# |" P& B6 C- F
4 3 00010ED0 _TM_DecodePictureH
1 Z6 U2 ~' z. d4 `( k4 @0 s) j' { 5 4 00010FD0 _TM_GetFileEnd@4 ! N- L& c6 o3 S/ L
6 5 00011030 _TM_GetUValue@4
6 D6 z) C4 b2 N6 c 7 6 00011060 _TM_GetVValue@4 6 ] w9 F7 C7 B% P
8 7 00011000 _TM_GetYValue@4 ) S" g' m$ V3 Q8 s9 c i
9 8 00010E10 _TM_OpenDecoder@8
' }3 A$ J! m \ 10 9 00010F30 _TM_ReturnType@4 2 T. R! z, n5 ]7 @* h" P
11 A 00010F90 _TM_SetFileEnd@8
' {1 ^1 O2 y7 h8 g. g* \: c7 ?: c 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号$ Q% y/ N1 m8 A
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
* Q! o o! _3 j' E# x4 u 最后形成.DEF文件如下: K4 [; \1 d+ W& l
LIBRARY "VideoDeCoder"
2 T) F; U$ e- w* [* m6 c DESCRIPTION "VideoDeCoder library"
% G- a( C0 \) Q- ]/ S/ o: B EXPORTS
: l$ Q% t3 F, U # m( `2 ~. m* p# K3 L/ H
TM_ClearDecoderBuff@4 @1 / D7 ^8 v; }* G
TM_CloseDecoder@4 @2
z. u& a, ` T' |3 {/ d TM_DecodePicture@4 @3 - l$ q- c8 V4 N* N. @7 [. L9 v# s" u
TM_DecodePictureHeader@4 @4
% H O: d/ t( q: L6 ? TM_GetFileEnd@4 @5
; i7 @. O S) ?/ ~9 U9 [7 k0 C TM_GetUValue@4 @6 ! q; ^4 V! N) p; }% Q0 n3 E
TM_GetVValue@4 @7 # Z4 D7 C* t7 \" R3 S$ G; d! O
TM_GetYValue@4 @8
: c: |! q1 t8 p$ a TM_OpenDecoder@8 @9 1 v5 J: M& _4 }7 U1 G( w. f; T7 E" E
TM_ReturnType@4 @10
9 ^7 w7 O/ i/ S: d" l TM_SetFileEnd@8 @11
1 u i% \1 U- O/ G1 K3 n$ A; g3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.( r g1 }& A9 P H/ R
EXAMPLE:( R, r5 l1 ^( G& Z4 d6 F
LIB /DEF:VideoDeCoder.def /MACHINE:IX86% e0 i0 I% Z4 J" n- q2 W2 j
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
% Y& K, D9 }6 B, X error LNK2002:unresolved external symbol "functionname@nn"! ~. @5 e2 C" M' ^5 F. L) b. p
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立. q) @0 e! ?2 v8 e6 |- }
LIB,重新链接即可.! L4 Z6 U- `5 }) n% L$ S: L
! j0 E* E% \- Q j) ~
这样就制作成功了符合VC调用方式的LIB了!. a; t8 v9 z( w7 W4 s- Q0 g$ @
参考:MSDN2000
+ C( Z# |* w y6 K要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!, m) r+ I4 |. b- ]) u
IMPDEF xxx.def xxx.dll
4 g. W- v# h& L( P0 S2 I这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
' k. J5 Z& y" P- {: L+ {1 r而在C++BUILDER中!. `& X: k1 S8 A B
__cdecl的函数输出前会带一"_"7 W1 N9 p& ], [' S) ~6 m& V
__stdcall无特征,只输出函数名7 r2 r9 D. C7 |+ d, I& @# k
__fastcall函数输出前带一"@"% T7 b. v5 c% S2 ]) \% }. ]8 \ I( A8 R
都无"@nn"后缀格式!
/ R8 z2 G/ w9 N7 o在VC中!
4 z! U( {1 m' C" _. b__cdecl无特征,只输出函数名
; J) H8 }( m9 S7 u$ q9 O' F__stdcall的函数输出前会带一"_"后缀带"@nn", e- |1 t. ~; \ P3 G2 t
__fastcall函数输出前带一"@"后缀带"@nn& _$ C |, h$ K7 w
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|