|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!$ [3 m, R9 X9 z' e4 O
( ]; t' O( @: ?; e
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
( T5 i; A; k! @( s' x EXAMPLE:
) K7 F$ Q' [. r# n B DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
! W; h6 K+ _2 x
/ |7 f# o* [$ P* ~ n% c2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
5 D8 N: ~ Q" r* ?& Y/ Q" K) h EXAMPLE:* g( G. O- o+ \- ^1 C) O8 p
VideoDeCoder.DEF 文件内容如下
# f/ S" @9 B6 A$ r% ~( g( o
; _& N) I/ [" ]$ j6 ^ Dump of file VideoDeCoder.dll 3 m4 C9 [0 x5 n: s) m" Y/ C
& x; @1 b( f0 v. ?6 o5 F File Type: DLL ) n" {. x% J, q
, ]( D2 e& B/ B- o. t6 @, W Section contains the following exports for VideoDeCoder.dll
1 d" q9 _8 J1 c# g( D. m
+ P# z7 ~# `4 G( A# U 0 characteristics
d, C- ^" x* h' M( r 3D49E48F time date stamp Fri Aug 02 09:46:55 2002
% C+ [+ I) a, g% K. h3 ~+ O 0.00 version 4 p, y, k: c: H% q- B: _: n( r
1 ordinal base : U/ F% T: |0 K3 t% H
11 number of functions
0 w6 E" O* {; ^8 _5 M 11 number of names
% F+ j; ?6 D: O. ^5 S. \( U v 6 U1 m6 l. h, O+ @! p/ f4 O
ordinal hint RVA name 8 `$ q6 s5 l" @1 Z# {
4 U9 w7 p/ d( c! D 1 0 00010F60 _TM_ClearDecoderBuff@4
, B' T4 `; ^" M, n; b/ m 2 1 00010E80 _TM_CloseDecoder@4 ( O5 _0 }; s! c) U: y5 V* K
3 2 00010F00 _TM_DecodePicture@4
# v% Q% _) s# _ 4 3 00010ED0 _TM_DecodePictureHeader@4 T& {# k: c7 ~5 W, g9 i' M7 E: Q
5 4 00010FD0 _TM_GetFileEnd@4 . q, H) e5 V& S- w7 |
6 5 00011030 _TM_GetUValue@4
+ d M) S% m9 }4 L" z( h. @ 7 6 00011060 _TM_GetVValue@4 ( X: H6 ]4 E$ _9 L
8 7 00011000 _TM_GetYValue@4
1 S \4 B1 U. F7 N5 G& I 9 8 00010E10 _TM_OpenDecoder@8 & V* ~6 d, q! ]7 K2 Q9 C7 F; p
10 9 00010F30 _TM_ReturnType@4
9 z/ k' C+ s2 m, o+ t! |! a4 [) K 11 A 00010F90 _TM_SetFileEnd@8
0 F) ~7 ]3 Q0 q7 C
% n$ m0 {# _3 h3 T) u* O Summary ' d# @ [* K; K+ \
8 T+ O, M/ @' @, T 2000 .data
5 ]( [, [6 Y9 t6 b) n% r- d4 g 1000 .rdata
' u- [8 \) J5 s) ] 1000 .reloc
8 M7 m4 h. }4 M# n 15000 .text % ?1 M0 g$ a# n: h# I) N7 @
按照以下方法整理:
3 P& E1 P) _4 n* R 1>添加LIB说明+ B3 P: J6 X# b8 _+ ~# W
LIBRARY "VideoDeCoder" ;"xx"为DLL名称, H- U2 S0 i. b3 y' M- E n
DESCRIPTION "VideoDeCoder library" 0 J* p! k( }" |$ S7 C$ a
2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
' w9 a4 o' J P T5 L# g LIBRARY "VideoDeCoder"
' U5 U7 J5 s+ j9 ] DESCRIPTION "VideoDeCoder library" ?2 Q3 ]" ?$ e, O7 y
EXPORTS
& u2 ^+ L1 t, N+ @6 I+ k ordinal hint RVA name $ x) n& w, K: W
8 l ]* r) c" h: i
1 0 00010F60 _TM_ClearDecoderBuff@4
d8 K# p3 p& K! ^+ r' C 2 1 00010E80 _TM_CloseDecoder@4 ' d" ^5 b+ S$ b3 G
3 2 00010F00 _TM_DecodePicture@
, ]* t* z# `, P; k: X8 _3 | 4 3 00010ED0 _TM_DecodePictureH
# M( V/ |! R! K 5 4 00010FD0 _TM_GetFileEnd@4 ( D, v- O' w, D" X1 d: c
6 5 00011030 _TM_GetUValue@4 2 t- D0 K0 p- L2 S! i
7 6 00011060 _TM_GetVValue@4
/ R W' T4 X9 H7 L( q 8 7 00011000 _TM_GetYValue@4 1 D$ M1 i! w) R8 i1 f
9 8 00010E10 _TM_OpenDecoder@8
* k/ c. N+ [9 s: l1 {- q" `! F8 z 10 9 00010F30 _TM_ReturnType@4
4 R5 K% U( y j5 f; {& v 11 A 00010F90 _TM_SetFileEnd@8
+ z3 k, ^/ Z/ r1 O4 @ 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
' c/ Y( x. W' V, ?7 w9 L 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").8 C8 j2 i5 S8 |% Q
最后形成.DEF文件如下:
! }6 F9 a" z, d8 s$ ]9 h LIBRARY "VideoDeCoder"% {; v) h: }$ t% h4 d
DESCRIPTION "VideoDeCoder library"
( `- ?4 g1 A3 N) [4 M EXPORTS
) o# W* P' T& D' B& I. L+ B. s / n0 y% s# Z$ i: Y
TM_ClearDecoderBuff@4 @1
# O# @9 L& q; C. U+ }1 j6 ^ TM_CloseDecoder@4 @2
- b6 c8 |2 C. B6 z0 q7 e& K- P TM_DecodePicture@4 @3
0 |! u! e: v5 F3 L9 O/ E# w. r TM_DecodePictureHeader@4 @4
# D# h1 |) U, w! D6 L# p0 ? TM_GetFileEnd@4 @5
1 u9 \3 R6 N8 ], ] TM_GetUValue@4 @6
8 [1 ~# {7 k1 A+ G3 P; k TM_GetVValue@4 @7 * b# D: E3 U5 n2 g7 o. Y
TM_GetYValue@4 @8
5 K; a) m7 E( Z: P! Y: L TM_OpenDecoder@8 @9 , {! e J0 X9 E' y$ {1 v
TM_ReturnType@4 @10
5 U8 W- G0 i# I# ?+ q' n5 Q1 \ TM_SetFileEnd@8 @11 - g' d- _& `( O
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
. D$ b2 i/ G: s- U* ]3 ? EXAMPLE:: U7 ]+ M% b% k2 g2 P
LIB /DEF:VideoDeCoder.def /MACHINE:IX86* _: v6 e; L" {
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
& r0 }& k8 c) V& O error LNK2002:unresolved external symbol "functionname@nn"
! W: ^! u9 v: ]6 B# n# O提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
1 t5 S( f+ ~4 d2 \4 O7 J2 u6 U5 u. yLIB,重新链接即可.
2 f7 t) m. q' {/ k$ C, w$ a
/ T) f \3 Z* S) u) v; E7 F$ S这样就制作成功了符合VC调用方式的LIB了!1 D1 y3 q, g* w8 \& s9 \! P
参考:MSDN2000
) o& w3 h U2 R; |要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
3 n; q2 c& K9 u0 Z) c# [6 zIMPDEF xxx.def xxx.dll
o! [, f0 M* a% b: U, b这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
9 y* V4 _7 C5 } U' }3 M而在C++BUILDER中!, Q3 W, E; z1 m
__cdecl的函数输出前会带一"_"* |7 d" C+ x2 _! }& X" I( n
__stdcall无特征,只输出函数名
3 S' ]) h$ \1 g# z/ F9 H__fastcall函数输出前带一"@") _# t: r) n- j; C1 j3 a
都无"@nn"后缀格式!
" Q4 d7 d, S4 ]% Z2 I$ z在VC中!8 X! _& g, U" J
__cdecl无特征,只输出函数名* u, t4 x# q2 |3 b/ z7 Y
__stdcall的函数输出前会带一"_"后缀带"@nn"
! ~# M9 S/ Q, Q7 l* n__fastcall函数输出前带一"@"后缀带"@nn4 E* M9 V, V2 ?) R) |
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|