|
|
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
0 o5 c& p' [) n, E; o- ?/ f3 m4 n( H( Y# d8 c: U
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
$ C; L7 P$ g4 ]+ E8 i EXAMPLE:
+ f1 }. \7 D0 b# u/ M8 f DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def/ H$ F7 ^- Q! f) M
" r2 w0 C4 n1 {2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件% v) N$ M0 X/ U1 D) ]
EXAMPLE:6 l9 _( I0 S8 G: X* B! V
VideoDeCoder.DEF 文件内容如下
+ d* | ?" H4 F `) \- B& `
! z! S0 j- H0 a Dump of file VideoDeCoder.dll
% Z( F( m% `7 b- G# E0 a( y- W2 `
$ U$ i" t7 H' p1 d File Type: DLL - E4 ^$ a8 w9 T7 k
# v! U9 z a8 f$ p- M% n4 c5 B
Section contains the following exports for VideoDeCoder.dll
- h% g* N F9 O J5 L* {- f) L
' f: v% P3 L j$ }& ^+ d) r 0 characteristics ' D" t9 |9 k! g* l
3D49E48F time date stamp Fri Aug 02 09:46:55 2002 * j1 `9 ?6 [9 o
0.00 version
) H+ p; G+ F8 n2 ?0 Y. _# f 1 ordinal base
; n5 S3 D7 d& ?0 R' Q 11 number of functions
1 B- Y. z: e& i3 Q# a 11 number of names
8 p* ]2 K% ~5 X% p" B9 K : G# N! _( `7 x4 i+ j* r. q0 n
ordinal hint RVA name
; A* w- U# D9 Z9 G* `
5 z: Z8 z; Y. Q; a/ [: a4 ]; ? 1 0 00010F60 _TM_ClearDecoderBuff@4
/ t7 E* W4 `: b+ F2 y) N: m 2 1 00010E80 _TM_CloseDecoder@4
5 {. w5 ~% c0 }8 b( [% y$ _ 3 2 00010F00 _TM_DecodePicture@4
8 h# s2 U; m) v+ h0 i- a4 S 4 3 00010ED0 _TM_DecodePictureHeader@4 / r; J3 ~( y6 Q5 P3 ~9 w- Y' X, X3 e
5 4 00010FD0 _TM_GetFileEnd@4 0 p% A( D! V: z& u# o/ k
6 5 00011030 _TM_GetUValue@4
/ b8 I, {; @6 j4 J* y 7 6 00011060 _TM_GetVValue@4 ) k4 } y0 R8 L2 w0 Y. b$ D
8 7 00011000 _TM_GetYValue@4 ) c# u6 r% g" R8 x1 Z% H4 Z7 A
9 8 00010E10 _TM_OpenDecoder@8 $ V, |6 [$ J# T+ _: F! V
10 9 00010F30 _TM_ReturnType@4
! a |+ E9 d T3 P 11 A 00010F90 _TM_SetFileEnd@8
, [ \* ~: n2 k1 g% ]8 z3 u 3 J( Q5 y' l. ^7 b
Summary
2 \7 w! X3 S" P% c- B
* C/ P) q# P0 ^+ _. @) } 2000 .data
" Q6 T/ a9 {) Z+ V/ ` 1000 .rdata
9 l3 v' m; b$ W2 ~+ u8 T' Z 1000 .reloc 4 F0 Q7 K( O) K- z9 s q
15000 .text
1 r: h- g0 U- X" P# C/ m) l: Q 按照以下方法整理:# t" `& w( e) j% k
1>添加LIB说明9 q) x8 v8 `2 ]+ h
LIBRARY "VideoDeCoder" ;"xx"为DLL名称: m9 V ?4 l. H( M" Z/ Q. E" P
DESCRIPTION "VideoDeCoder library"
% y3 _# V9 o/ C3 K3 S- N( Y 2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数% z: f; @' n9 s+ j; I
LIBRARY "VideoDeCoder"9 w! H5 e, z% F3 J0 l9 Z
DESCRIPTION "VideoDeCoder library"
& S. I8 }% U& ^* W; U0 P EXPORTS
. {1 {* U, n7 }$ V; r$ `/ p ordinal hint RVA name 9 W1 n8 }; E0 h& {
- A$ h3 x/ z# s% i- ^1 p. p 1 0 00010F60 _TM_ClearDecoderBuff@4
4 a( r! S$ J4 j A& t2 q$ u N 2 1 00010E80 _TM_CloseDecoder@4 / G& f" q. I" P1 q2 ^4 M$ E, Q8 N
3 2 00010F00 _TM_DecodePicture@
# J3 `4 A) X! }5 d/ P q+ |3 ]4 J 4 3 00010ED0 _TM_DecodePictureH : T0 T8 w0 R4 Q5 h& m# p
5 4 00010FD0 _TM_GetFileEnd@4 `- H+ X; M5 e% y' ]3 m1 @
6 5 00011030 _TM_GetUValue@4 6 K+ a- e% X1 Z/ A P5 Z
7 6 00011060 _TM_GetVValue@4
_* c7 F8 ~9 N) z$ Z 8 7 00011000 _TM_GetYValue@4 # S3 a& t2 {" S6 i4 _/ V
9 8 00010E10 _TM_OpenDecoder@8 # X9 R. E0 y; E9 Q; q6 C
10 9 00010F30 _TM_ReturnType@4 " u; m" N1 o* z- H: x6 s
11 A 00010F90 _TM_SetFileEnd@8
) [; q5 D, w; X! N; [: Y 3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号! ~9 K) D0 j! t! ]0 }+ w
形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").( [! l& m+ w, z. g
最后形成.DEF文件如下:/ ^) k* @4 s, @) A4 i
LIBRARY "VideoDeCoder" K2 L- B3 J5 z2 N3 V: b
DESCRIPTION "VideoDeCoder library"
2 v# L' U6 D. r; A EXPORTS1 V% E6 u- N, d" E0 M$ d
2 m: X- | h, a) y; `" J TM_ClearDecoderBuff@4 @1 " ~! r( {0 m9 B* [, L
TM_CloseDecoder@4 @2 4 c$ H1 O, j0 I, m7 |% a
TM_DecodePicture@4 @3
7 o2 E5 H! o) s4 ?2 }# |0 i TM_DecodePictureHeader@4 @4 2 {6 c5 a. O. I) a7 j- D
TM_GetFileEnd@4 @5 4 Z+ d( J+ C- p5 {, ~1 A/ h) Q
TM_GetUValue@4 @6
: R0 n# n+ R3 y/ ` TM_GetVValue@4 @7 ' v6 B+ ^, i1 y2 b- A1 }, _: p9 N
TM_GetYValue@4 @8
F5 ~$ ~6 h' ?. `* X0 ^3 N$ ?5 A TM_OpenDecoder@8 @9
) u1 h" X0 p; M7 I L" p TM_ReturnType@4 @10 7 u% W4 C: F3 V
TM_SetFileEnd@8 @11
! l j; F- ~- y; O" t" E3 ]/ y3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
# m% N& ?5 p4 y, }7 F7 u; Q EXAMPLE:/ u( I E4 v& }) V
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
, @& Z5 ]4 H6 n# [' ]4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
) i* D; A* c4 k/ [ error LNK2002:unresolved external symbol "functionname@nn": R1 x; m( z" d6 H
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 a/ D6 O m X, ?1 [
LIB,重新链接即可.* d2 g' X: ~: a k' N
# k; e. D! ]2 P8 U
这样就制作成功了符合VC调用方式的LIB了!! R$ A8 b( v! g7 h- T; y7 [
参考:MSDN2000
' ?: ^; \1 q" w; _, ?" y要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
1 f) n* ~! ]; @: _IMPDEF xxx.def xxx.dll
u3 R' E5 d/ ~这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:% F1 A$ m; {/ h, m7 ~4 b
而在C++BUILDER中!2 b0 J7 o" `: x8 f7 f
__cdecl的函数输出前会带一"_"0 S# b/ a: s8 t9 g) ]& v
__stdcall无特征,只输出函数名; T. x3 W# F* Q% b; ]4 e1 @
__fastcall函数输出前带一"@"
0 z0 p, O: F% M+ v9 V- k都无"@nn"后缀格式!/ ^/ u( [7 j( H+ S
在VC中!5 z' G$ n* d. C7 B5 e* z2 b4 }
__cdecl无特征,只输出函数名) e7 t$ r! |' A" s
__stdcall的函数输出前会带一"_"后缀带"@nn"
; G- l% l# P( v+ j* s! n6 K__fastcall函数输出前带一"@"后缀带"@nn
2 s9 a4 E" k S/ X/ o; Q只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误! |
|