|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!% m5 w& y+ X4 r3 w8 P
& s' _. A( q8 }) J3 H1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
6 e9 v f) }. q4 n' P3 I! o EXAMPLE:
+ {& v8 h5 X0 N9 T. T! D+ t DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def$ F! \5 {2 X( W4 S3 ^: o) ^
! V' f; v! y4 d& z4 y' a7 b( ?
2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件0 G. y4 z& r1 n- J2 B0 u! o$ L' z
EXAMPLE:
1 x w# H) H4 Z VideoDeCoder.DEF 文件内容如下: e0 U8 c# Q+ W. ~: ?7 `" a! c
) {8 d- a5 e& F, P) s
Dump of file VideoDeCoder.dll
) q: f8 z9 Z/ L5 b
- m( d. v: \* j File Type: DLL
% D2 |: \7 k* W) ?5 J' v
% Z" F3 d8 s+ R$ C; Z; |- t# e: n Section contains the following exports for VideoDeCoder.dll 8 ^; z/ r* a, R& V$ j% w& K
- C$ N1 c. c/ T' n$ u3 v6 L4 {
0 characteristics
/ ] P$ P1 c: Z* c8 j/ p) L 3D49E48F time date stamp Fri Aug 02 09:46:55 2002 : B1 Y r- W- k+ {) U, N
0.00 version
. N9 k# L3 k( m1 X) f9 ~! g7 I/ [ 1 ordinal base 6 E+ b0 ~9 O0 r3 M3 B1 W
11 number of functions T- }( G" ]4 S* t8 e* a
11 number of names ! ]$ i: i) ~9 e) L8 G( h
; s6 u; T# C, b ordinal hint RVA name
$ Y! k* }1 k' ~: q6 A! q+ U2 f0 l( a 5 B: O) b2 g: A& V- Z' ^, F
1 0 00010F60 _TM_ClearDecoderBuff@4 * y9 [4 @1 g5 D4 E& y* m
2 1 00010E80 _TM_CloseDecoder@4 5 @% @0 a1 A! C1 u1 w
3 2 00010F00 _TM_DecodePicture@4
- p( `, {6 k0 K- m* \ } 4 3 00010ED0 _TM_DecodePictureHeader@4 8 e# k9 n2 V2 b) p" g1 Z
5 4 00010FD0 _TM_GetFileEnd@4 & G7 t1 C O4 A: r
6 5 00011030 _TM_GetUValue@4
$ j/ ?; _9 {( G+ e% i7 i( z 7 6 00011060 _TM_GetVValue@4 * P* F* Z3 E- |; Z
8 7 00011000 _TM_GetYValue@4
& o8 h i6 @" s( q( x$ y 9 8 00010E10 _TM_OpenDecoder@8 & W5 {; f3 y0 U* L
10 9 00010F30 _TM_ReturnType@4
% t( `; L. d* b. H 11 A 00010F90 _TM_SetFileEnd@8 ( W! F8 e% e! T% P
& }" b1 k$ X {' Q" n
Summary # J- z! Z3 D* H/ f/ S, l4 V
7 Z8 G3 Y% U8 T! Q+ e) V 2000 .data p! ]# L, E' A2 |1 s( r
1000 .rdata " [5 J0 T: K9 b% g" P4 |
1000 .reloc
8 M/ {; ]- i4 p: v* a" Q 15000 .text 5 k0 O; S' f9 i- E. e
按照以下方法整理:
. o+ i D* L" @5 _6 n 1>添加LIB说明# ?% I2 e1 F# G- j; H6 m9 \
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
8 l3 P4 p9 h+ x% \4 n& h DESCRIPTION "VideoDeCoder library"
8 _' {0 }; _6 J8 z7 A+ B 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
% U) C) M7 K& ?; l LIBRARY "VideoDeCoder"
1 P; P1 f5 K9 ^ DESCRIPTION "VideoDeCoder library"5 v# q! W- G& A& B
EXPORTS( i9 M' Q# l- @ P* g8 N0 F* O
ordinal hint RVA name ; S+ f1 S# e7 }9 [$ ~: o$ b
% G- l& G! x* S1 L3 t- b
1 0 00010F60 _TM_ClearDecoderBuff@4
6 i/ O: m6 ?3 ]6 _3 z5 Z0 M' y, V* z 2 1 00010E80 _TM_CloseDecoder@4
0 K) Y1 K8 O2 f8 M 3 2 00010F00 _TM_DecodePicture@
& _1 r& ` o: ~ A1 Z- K# c' i 4 3 00010ED0 _TM_DecodePictureH * o5 I3 z. Q) f
5 4 00010FD0 _TM_GetFileEnd@4 - F1 I2 n. j% j$ c, h8 U
6 5 00011030 _TM_GetUValue@4 3 j+ k/ `7 F. [+ j. g7 d
7 6 00011060 _TM_GetVValue@4 , y3 M. X4 Y$ y
8 7 00011000 _TM_GetYValue@4 6 B2 N7 _- S d+ n$ J
9 8 00010E10 _TM_OpenDecoder@8 0 B# h' c# i5 G7 Y+ b
10 9 00010F30 _TM_ReturnType@4 ) Q" N4 b3 I2 F
11 A 00010F90 _TM_SetFileEnd@8 2 ~- A2 \) B) j% E$ w
3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
1 R) o4 T) ?1 U" _7 |, b 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
9 k$ L5 t8 I, S7 r7 w 最后形成.DEF文件如下:$ Q( T! M! T2 o7 Q
LIBRARY "VideoDeCoder"
0 I* o4 F1 I8 s7 ? DESCRIPTION "VideoDeCoder library"9 p0 e" j4 I( b9 n. C+ R1 `
EXPORTS) j0 X+ [6 T0 S! }7 F F
; ~ \% h. Q" Q1 h: H TM_ClearDecoderBuff@4 @1 : [5 D9 |* F) N4 X
TM_CloseDecoder@4 @2
+ Z- i d* u# ` TM_DecodePicture@4 @3
8 A- h3 L3 i a2 t3 @" m- m TM_DecodePictureHeader@4 @4 7 V @7 q$ Y$ H8 ^0 r! b1 v
TM_GetFileEnd@4 @5
! y" ]/ r2 X5 m TM_GetUValue@4 @6
! p. b \$ ^5 S+ u5 G# N" } TM_GetVValue@4 @7
: [/ |1 k+ I" S- o, |; I3 P TM_GetYValue@4 @8
4 ]9 o" d# {0 _; N4 K! l, U TM_OpenDecoder@8 @9 # P8 E( h! F1 n$ F* U
TM_ReturnType@4 @10 ; G, l/ M G! x4 w! J
TM_SetFileEnd@8 @11 5 w5 V! j* l( ?, ^/ i1 {
3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
1 J/ Y' S5 \# D$ i5 E( a EXAMPLE:- ^& P I) O& \) N4 F. X
LIB /DEF:VideoDeCoder.def /MACHINE:IX862 t1 p h- Z5 U- n/ y# @
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:9 d+ B$ Z6 b# W" T9 w1 E) A; U( c$ @
error LNK2002:unresolved external symbol "functionname@nn"
9 y" Q0 Z: V; z. T' z提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
5 x4 K! Y# ]( M4 d( p' ]# j- QLIB,重新链接即可.* C7 J" L; U% Q; u& O: H
/ M! [" `8 T0 s* Q K; T8 D
这样就制作成功了符合VC调用方式的LIB了!
( L( y5 r, J( Z: h4 Y, B! G, D参考:MSDN20008 }. G- ~+ q1 ^- E' r% M
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!$ t) B) s7 |9 d( d; M7 s
IMPDEF xxx.def xxx.dll! v* Z9 O, E* M* l
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:$ ?$ }* B; }- c5 _
而在C++BUILDER中!
/ J' _9 ^0 S; t' W__cdecl的函数输出前会带一"_"7 M6 t9 n/ f3 N9 q2 L, c
__stdcall无特征,只输出函数名
, ~/ M5 j9 a' V' i__fastcall函数输出前带一"@"1 Q4 f' h, X/ b g2 R
都无"@nn"后缀格式!! U3 i8 R6 V' Q4 L8 |. l0 y
在VC中!1 X5 A [" m3 H) s# F4 c0 y( B8 V3 U
__cdecl无特征,只输出函数名
+ P3 p) E7 H: Z' f' w. T__stdcall的函数输出前会带一"_"后缀带"@nn"
# o0 ?% ?6 H+ S7 v" j, K__fastcall函数输出前带一"@"后缀带"@nn# I9 B5 a+ i, ~: k- t, E
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|