|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
2 L0 q2 i7 \; C3 |( E! C% l; Q n0 I8 x2 e9 m
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件8 A2 u7 g1 R7 b2 e0 z: }3 u4 A
EXAMPLE:: a7 |6 `- ~3 X9 V) t7 y
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
3 f5 M- U7 O2 U0 S, W
2 R8 X5 h. E& U7 n/ s% U6 q* b2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
% @- N7 X( ^) J( J: S* J EXAMPLE:
: b" b; y! V7 ^$ p; ^5 h VideoDeCoder.DEF 文件内容如下( O* r- O! ]3 z* }# g, p
" A" I& V# j. r0 E( R! s
Dump of file VideoDeCoder.dll 2 E9 f- z: G0 s' @" d' H" I/ m
; d8 A& t& V/ S0 C' Y+ |; E; E$ C
File Type: DLL ' r) A( j s7 P' ?0 C( Z
5 D7 @) t' a6 H K( U
Section contains the following exports for VideoDeCoder.dll # ]7 F, y8 l: b9 D' a5 |2 X- g. e
$ o% ?" [; N- j: L8 v 0 characteristics
6 \ r& W+ E# O, p+ p" }+ D4 k 3D49E48F time date stamp Fri Aug 02 09:46:55 2002
0 F8 m8 H) b: v7 V& b 0.00 version
- o, v9 g# H2 F" I# t 1 ordinal base
- d/ n6 I# |- O" C2 W" c4 J7 f 11 number of functions
( T" b( a/ [4 W# b3 Z 11 number of names W8 l% C- {0 F: b/ T' b, J
+ ~, [5 a% z/ K. K% ]# ^8 c
ordinal hint RVA name 8 b/ l$ t5 L, r
1 _. b3 i: ?0 L, |/ I9 z 1 0 00010F60 _TM_ClearDecoderBuff@4
2 r0 Q. k" v4 T: k2 i 2 1 00010E80 _TM_CloseDecoder@4 2 c0 ]5 U/ v ?- x( L
3 2 00010F00 _TM_DecodePicture@4 & ], u% }5 R# e
4 3 00010ED0 _TM_DecodePictureHeader@4
. t; w6 V! q8 G" R" |% @* C3 Z0 t; Y# Q 5 4 00010FD0 _TM_GetFileEnd@4
3 S a, V5 B3 z3 n: L" k/ l 6 5 00011030 _TM_GetUValue@4
; S: W2 @* Y$ v5 ` 7 6 00011060 _TM_GetVValue@4 6 g) T" y6 S: k9 R$ ]
8 7 00011000 _TM_GetYValue@4 3 n% C: z/ u) v9 @4 W8 m# }
9 8 00010E10 _TM_OpenDecoder@8 4 ]) V& E7 R3 T4 D6 C
10 9 00010F30 _TM_ReturnType@4
% y) F5 ]- p+ s0 d7 O 11 A 00010F90 _TM_SetFileEnd@8 7 k5 t* i" S! @& n6 c( ?7 ^+ R
6 `0 j/ T& G% _" a9 L3 H; V& O Summary
" h, b( _2 X' E8 e
$ W7 G: y% J0 Y5 o- I5 M7 j( m* ` 2000 .data # L4 t( m% N* S# W5 s0 V- o3 u2 I
1000 .rdata
, e6 I) }. ^. Y! B9 @ 1000 .reloc
6 r1 C. j, _. ^; n8 y 15000 .text
7 W5 T8 U) _+ e- p- f3 Y& P0 P- }& W 按照以下方法整理:
% U; k& U0 ^6 N+ I* g5 ~) Z( L9 _ 1>添加LIB说明2 J- @& I( H4 @6 B9 g; F
LIBRARY "VideoDeCoder" ;"xx"为DLL名称
- V; ?/ x/ x2 t4 |+ ?, s DESCRIPTION "VideoDeCoder library"
) D$ S; L$ l: {& T8 o) c2 k" f 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数8 M' O/ _' {# l/ A4 u
LIBRARY "VideoDeCoder"
# b7 r- P! c0 ^6 Q% t DESCRIPTION "VideoDeCoder library"* W$ V6 z$ i: C6 B" B% z
EXPORTS# {) a6 k! X! E/ q6 q7 _5 M- e
ordinal hint RVA name ' Y2 C' o) Y1 {: }/ G9 h4 D
; I+ J' q; H+ p) N0 f, ?; Z 1 0 00010F60 _TM_ClearDecoderBuff@4 5 d2 e/ {4 _/ L# r: e9 o0 W( Y5 M; q
2 1 00010E80 _TM_CloseDecoder@4 , G1 ~8 L1 N/ @3 S5 g! P& H
3 2 00010F00 _TM_DecodePicture@ . k7 j( D( r- q& k) a
4 3 00010ED0 _TM_DecodePictureH 5 p2 L- C/ X: ^7 q9 f! a$ j
5 4 00010FD0 _TM_GetFileEnd@4 3 U w( x& C I$ G5 l
6 5 00011030 _TM_GetUValue@4
, s7 U2 a, G" @% @! S 7 6 00011060 _TM_GetVValue@4 % O# }, x: J2 }( J! w6 w7 r
8 7 00011000 _TM_GetYValue@4 & K$ C) U2 s/ v
9 8 00010E10 _TM_OpenDecoder@8 8 `2 U9 W9 K7 j" i$ y6 |' n
10 9 00010F30 _TM_ReturnType@4
/ ?& N# b' I, n+ E a7 t 11 A 00010F90 _TM_SetFileEnd@8
2 B! s4 i O8 @9 a3 [( ^ 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号4 M F2 d, d1 ?4 {* R+ h: S! }
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").
0 w. [: A! k; Z1 @) Z8 l$ u5 i 最后形成.DEF文件如下:: B: _$ n" {' x9 X
LIBRARY "VideoDeCoder"
$ _( R* w. I1 i% {, q DESCRIPTION "VideoDeCoder library"
) J$ n1 w* y; b9 ~7 B/ Q* k EXPORTS
6 Z, z& [; v1 H# q$ d9 G ]
, K+ ]7 X: q/ |+ u; @. A2 R/ i TM_ClearDecoderBuff@4 @1
2 w) F; B6 }7 t' ^5 a1 Y5 I TM_CloseDecoder@4 @2 * z3 t W9 L' k K7 Q
TM_DecodePicture@4 @3
) }' }2 A5 U- K* }1 f TM_DecodePictureHeader@4 @4 & A) a' `* u H; m' h# `
TM_GetFileEnd@4 @5
# s* e# x6 o0 [0 [6 V$ D TM_GetUValue@4 @6
c" T6 F+ y8 e3 S& r TM_GetVValue@4 @7
# f8 l! b: _ G# l' R& y TM_GetYValue@4 @8
0 @$ F0 B: {2 p" K TM_OpenDecoder@8 @9 ) {5 K* J: b& b9 I( A9 g h
TM_ReturnType@4 @10
' t( b6 u6 Z0 s6 O TM_SetFileEnd@8 @11
' k V% g9 l1 o) N# ]% T4 m+ S, ]& L3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
" H. h8 s0 F, L EXAMPLE:
d. s0 M9 |; O# E* Z LIB /DEF:VideoDeCoder.def /MACHINE:IX86( r$ J8 r" @$ o$ k) I9 f z1 C$ ]
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:# I2 y3 \% V! M+ Q0 f2 @
error LNK2002:unresolved external symbol "functionname@nn"
" W$ Q: z/ Z- V" L6 @; x提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
; k" U, [, s! w* T4 l! Z5 M, P2 HLIB,重新链接即可.
1 ~: J) P9 m& S, a. p6 y# _1 I
4 G% `2 [6 Y4 V6 |这样就制作成功了符合VC调用方式的LIB了!
& {2 L, ~1 Q/ y参考:MSDN2000+ u b9 F2 m7 b) X
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
& r/ K. ~* R: d5 j4 N5 [$ [IMPDEF xxx.def xxx.dll
6 ?0 M# a0 B, c0 ]: W1 \ i+ Y4 y这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:7 i2 b* j' H$ W" |
而在C++BUILDER中!
+ {5 P$ I o/ |/ z__cdecl的函数输出前会带一"_", n; l0 F+ d( g) i5 n7 f
__stdcall无特征,只输出函数名" d' c, ^* h( X: k) X
__fastcall函数输出前带一"@"1 f% Y: C, a* ?' u# [4 S3 }
都无"@nn"后缀格式! {, s7 Z( y4 M1 x+ x
在VC中!( O/ B: H! a1 E( ~9 A
__cdecl无特征,只输出函数名6 P% J% k0 X8 j% I
__stdcall的函数输出前会带一"_"后缀带"@nn"& B. i6 r' A; T& R7 K
__fastcall函数输出前带一"@"后缀带"@nn
, P J9 x% T; y D- e2 w0 [6 G- l& [只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|