|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
" K* M2 [- _7 `1 S) G% A D \9 r
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件3 C! ^/ C8 c2 H
EXAMPLE:
, @5 X( E" D2 t DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
% D* e% h" }, q) X% R) I! t
7 K, P7 z n) r: L/ [- V2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件# b/ C/ M2 I% C6 E+ |
EXAMPLE:
1 t; O) D3 b& E VideoDeCoder.DEF 文件内容如下
; j6 T x% a3 K5 v v* `% ~6 B 0 r; U0 j* ?! A8 n+ p" m
Dump of file VideoDeCoder.dll : M$ x J% B+ K9 v. Q* j
8 C! d6 Y' V4 u6 i$ P9 d) b
File Type: DLL " ^( E o2 j) }! e5 [/ c
* B2 k# N: \9 U4 r, U4 e Section contains the following exports for VideoDeCoder.dll
4 `' A, q/ l* k " I5 {, e# P' g, g; `9 W% t: J
0 characteristics 2 b0 M7 U8 W6 N3 F% [
3D49E48F time date stamp Fri Aug 02 09:46:55 2002
$ y- C8 Q3 o/ J' Y$ {6 ? 0.00 version
5 L4 x- V! Q0 ~3 j4 _ 1 ordinal base
, Y% L1 L. q" j0 }- I 11 number of functions - e) W. O' N' ?, S
11 number of names " g" i! {4 q: J( f4 M4 S- m
1 Y5 A+ m# x' Q8 h+ n8 z, j
ordinal hint RVA name
2 Z) @- [& E" U2 L# h, d - W2 P# w7 m' L5 @/ p! ^) A
1 0 00010F60 _TM_ClearDecoderBuff@4 ' N# J, i( u% a1 a! a
2 1 00010E80 _TM_CloseDecoder@4 ) {* K3 J$ K+ V4 h% \
3 2 00010F00 _TM_DecodePicture@4
$ F7 ^- Q. L+ F& w* f; H V+ R 4 3 00010ED0 _TM_DecodePictureHeader@4 G4 k8 u$ I+ c5 z: ?3 z" K$ Y7 u
5 4 00010FD0 _TM_GetFileEnd@4
/ C8 g! i, x4 \) [$ ~- F0 B 6 5 00011030 _TM_GetUValue@4
0 W! V- K2 o, L& M3 y9 K 7 6 00011060 _TM_GetVValue@4 9 h* F0 n" I8 d0 V
8 7 00011000 _TM_GetYValue@4 " I/ ^9 M+ i2 j- F M# F1 |
9 8 00010E10 _TM_OpenDecoder@8
6 a' p* a4 A" O1 K1 l: r 10 9 00010F30 _TM_ReturnType@4
& O: ?$ x) @2 ^" v: o; f% ` 11 A 00010F90 _TM_SetFileEnd@8 8 l+ w- q! d3 H+ F9 b# V
: E0 ^3 ?; [( m/ M. h0 c- a3 D9 V
Summary p; |/ s& s+ U- m- C, }+ Q
; n: v _4 c7 k
2000 .data
. I! M0 g$ K1 Q4 d 1000 .rdata
$ F$ o) x4 _% F6 [; W 1000 .reloc % s1 j( ]7 k" \) d3 \9 P9 p& O! n
15000 .text 9 ]0 a9 I) b8 B) T3 s% q
按照以下方法整理:
`( l* L) J e2 ] 1>添加LIB说明. X* s$ H3 `8 ?1 r5 M" y9 |. k
LIBRARY "VideoDeCoder" ;"xx"为DLL名称, I( y5 K+ D. q) l& {% u
DESCRIPTION "VideoDeCoder library"
8 Z3 Y! q9 N3 f4 P8 d* S2 @8 M2 x, u 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
x- y l1 F* W1 ]& b% P' v LIBRARY "VideoDeCoder"" S$ Z/ ~; j8 P
DESCRIPTION "VideoDeCoder library"0 t* c* k: Y" s0 q, P
EXPORTS
, k* v+ h, g0 a2 W1 u+ H U ordinal hint RVA name
. G: _1 O% u$ A' x0 c' V 1 J5 K" j! A* f. U V
1 0 00010F60 _TM_ClearDecoderBuff@4 7 {7 ?- C$ \3 d" Y7 }& o
2 1 00010E80 _TM_CloseDecoder@4 * }7 Z* F- Y- H& v4 t
3 2 00010F00 _TM_DecodePicture@ . d7 w3 u$ V1 U& ~4 {
4 3 00010ED0 _TM_DecodePictureH
# d/ A1 L" _6 e1 C) H- J9 K 5 4 00010FD0 _TM_GetFileEnd@4 6 v: Q+ v7 C2 X3 f/ B4 I
6 5 00011030 _TM_GetUValue@4 ; C; [" z% C3 ~) v; V1 G- A0 w
7 6 00011060 _TM_GetVValue@4
' O7 B, e5 u6 w& }& l2 ~8 d 8 7 00011000 _TM_GetYValue@4 ! Z; d' `9 [" n! w% r y2 ]
9 8 00010E10 _TM_OpenDecoder@8 - `7 z% X9 g# H3 c, u8 U
10 9 00010F30 _TM_ReturnType@4
r+ s" U! ~5 o4 r; p3 V" B 11 A 00010F90 _TM_SetFileEnd@8
3 n* `0 z6 z# p& A: E3 I& i( h6 S 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
0 ~6 H* c. L$ ]! J 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").5 _. C6 a9 t( q/ v
最后形成.DEF文件如下:
+ }/ z3 E$ \4 E6 Z2 r; u; d LIBRARY "VideoDeCoder"9 X+ s Q! e$ K& V7 j8 J
DESCRIPTION "VideoDeCoder library"
! \7 j3 a+ G2 |2 Q EXPORTS
5 E6 q7 ^6 S8 b: Z7 h
4 R+ Z- j% Y2 r4 M a TM_ClearDecoderBuff@4 @1 2 Z" R6 R% A/ Y6 P7 h9 J
TM_CloseDecoder@4 @2
& ] j+ J' n6 G0 q1 D TM_DecodePicture@4 @3
$ ^) a9 z: J4 d, [( @( @5 B TM_DecodePictureHeader@4 @4
! s# M( S* o8 D. C% O: U TM_GetFileEnd@4 @5 . ]. l! @% @* x- j( w- i" o
TM_GetUValue@4 @6
3 D& A2 p y4 H/ }' g TM_GetVValue@4 @7 - \# u. x6 X' \, x/ E
TM_GetYValue@4 @8
; B# g: ]- b( v: [0 H/ D TM_OpenDecoder@8 @9 * T( \0 r9 J) K6 m
TM_ReturnType@4 @10 % u# M) g% l: i# T( P8 H7 s
TM_SetFileEnd@8 @11 1 J" x9 F" t+ Q# n5 }8 x8 Y
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.& L; m+ A+ r' h4 W. Q6 j o
EXAMPLE:
$ q {- a6 K0 K' R LIB /DEF:VideoDeCoder.def /MACHINE:IX86% A: K: t2 ]5 N1 x; I* ~' O0 h
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:/ M# J6 j* W* D
error LNK2002:unresolved external symbol "functionname@nn"
) [/ s [0 u! O v提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
7 q& v7 E( _% c" OLIB,重新链接即可.
. F6 X" S# T" [0 E; R& {* M* f& z- z8 y
这样就制作成功了符合VC调用方式的LIB了!' h2 U& P$ `, E3 O- W1 d
参考:MSDN2000
1 L) N: ~& f4 |) _$ n. }; H要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
" c: h: }! [! Y; W3 eIMPDEF xxx.def xxx.dll
- s" ]# b& H" o1 @7 Y; S4 Q( L这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
2 g( X0 Q8 t' S% S而在C++BUILDER中!
; k3 H6 n6 L6 W__cdecl的函数输出前会带一"_"9 S1 I8 s6 U# C- M9 N3 M, L7 x0 a6 R
__stdcall无特征,只输出函数名
# _ U$ [" }! W! H. j$ P$ Y a K__fastcall函数输出前带一"@"2 @8 ?9 [( l8 P1 o5 h3 R5 u6 R
都无"@nn"后缀格式!/ p/ ^: p- k1 G' U2 ~8 n+ i
在VC中!
+ @- J" G) A0 }4 b, [7 [; R__cdecl无特征,只输出函数名
: k* p. j; G4 L: u% }9 y% m6 G* T) a__stdcall的函数输出前会带一"_"后缀带"@nn". x& \ g6 R- q, t4 ^+ n1 A
__fastcall函数输出前带一"@"后缀带"@nn
9 H" N' T' p6 t3 a0 K) W( m只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|