找回密码
 注册
搜索
查看: 4075|回复: 0

VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!3 {- W. v) ]1 b6 Z% m! C
* }' [5 v" Q* E6 v. h8 {% C
1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件& M: l9 F( r5 m4 L; j0 {5 G
EXAMPLE:6 S1 ^% {$ ], Y; }. W
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def! u2 V  s5 o4 Z* |, p

; C- ]7 `8 y$ N, X" n! z2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
" f% H: @! s, p; X EXAMPLE:8 D& E# G+ L! j+ p
  VideoDeCoder.DEF 文件内容如下
3 u8 J, O2 B7 M3 M6 d                                                                 
4 ^  q9 M$ N0 M9 Q, Q        Dump of file VideoDeCoder.dll                                    ]  B+ p- b$ l& M1 }
                                                                       7 ^7 t5 S# Z* q. r+ d- [2 f7 u$ b
        File Type: DLL                                                 6 O% h: ~! y# ?2 f' u( V
                                                                       
: G5 B4 X' q; Q4 x1 t6 c  W5 H          Section contains the following exports for VideoDeCoder.dll  
% i3 Q9 Y% b4 k: m                                                                       
3 U4 T( z0 s9 r& k8 U. g                   0 characteristics                                   9 Z& |( k( _& C; T4 c) ~
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          & w: t( |% y( l' ^$ {, A! I5 b4 c
                0.00 version                                          
5 d  l) k4 T1 j* h" O                   1 ordinal base                                      
% F: K+ Q# Y& h- Q2 h                  11 number of functions                               6 H, E( Z7 q' ]7 n' j
                  11 number of names                                   
8 i* F0 g$ l7 X% B$ O                                                                       ; U* C/ I6 S0 I- x: d& }/ G* @
            ordinal hint RVA      name                                 
  q9 v! k& @. [9 m! o& [                                                                       # T& S2 g* Q1 R) h
                  1    0 00010F60 _TM_ClearDecoderBuff@4               
5 t/ K& {, _! a$ h" ^8 s                  2    1 00010E80 _TM_CloseDecoder@4                   ' j+ R7 j0 A7 \* b
                  3    2 00010F00 _TM_DecodePicture@4                  6 `7 @4 y& Z# Y9 d: M% D2 p
                  4    3 00010ED0 _TM_DecodePictureHeader@4            
: u6 {5 Q7 q: ~- ?6 A2 {                  5    4 00010FD0 _TM_GetFileEnd@4                     8 \$ T, [  a2 f  \, b9 z
                  6    5 00011030 _TM_GetUValue@4                      9 H5 h6 A- O8 P0 ]
                  7    6 00011060 _TM_GetVValue@4                     
5 M1 v- e4 q3 s1 R3 z) m8 }  t                  8    7 00011000 _TM_GetYValue@4                     
9 S$ m! f7 \8 i. m                  9    8 00010E10 _TM_OpenDecoder@8                    2 l/ C6 K3 [$ Y. u1 F, T
                 10    9 00010F30 _TM_ReturnType@4                     ) c3 z) I, @5 b6 T: M
                 11    A 00010F90 _TM_SetFileEnd@8                     ' e* |' ]+ Q* k* b. ~) V
                                                                       
9 L; B% w1 k3 B" o3 c          Summary                                                      
. x  S- w" W& k& {5 v4 f9 j                                                                       
. C# F/ `2 R& ^9 B                2000 .data                                             
8 G3 u4 ^: l! }$ o& ]. G                1000 .rdata                                            
+ ~. v6 A5 [8 n                1000 .reloc                                            1 D0 F% H! @) m1 d% d
               15000 .text                                             
% D( e& V4 ?. z  按照以下方法整理:1 `( u5 y/ l& i6 r
  1>添加LIB说明
* |3 p+ w# Z2 v% [8 A   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称! j+ d7 {' F# r4 A, z  E
            DESCRIPTION "VideoDeCoder library"  
8 C; {" w3 M7 @% h  M* t        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数; c% t3 P, c9 \4 h
         LIBRARY "VideoDeCoder"# M2 F6 m5 M+ E, U" q$ d
   DESCRIPTION "VideoDeCoder library"
' b) C" K6 c8 G: d   EXPORTS$ p) X- W' a, N2 B* s/ @% ^
            ordinal hint RVA      name                          , y* o& Y* J5 y# w
                                                               
5 |6 C# F: ?* h% z' B. Z4 A                  1    0 00010F60 _TM_ClearDecoderBuff@4            
" A; L+ T' o& t                  2    1 00010E80 _TM_CloseDecoder@4            & n: U3 e& z. p9 x; `' ?( J
                  3    2 00010F00 _TM_DecodePicture@            
- |. i& v7 G3 U                  4    3 00010ED0 _TM_DecodePictureH            
$ t! [+ n  F: Y                  5    4 00010FD0 _TM_GetFileEnd@4              
- L- I! I6 l. s" W3 t- Y  e% h: V' p5 `                  6    5 00011030 _TM_GetUValue@4               
/ n% n5 \' s& q8 N8 W+ Q0 T  i                  7    6 00011060 _TM_GetVValue@4               + C1 s2 H# n" g: h  o& E  a, e
                  8    7 00011000 _TM_GetYValue@4               6 X7 J& I: N! ~  V) }* K
                  9    8 00010E10 _TM_OpenDecoder@8            
" ~  Q- C  p+ G: C& T1 X9 P! X                 10    9 00010F30 _TM_ReturnType@4              
+ g+ k) D% T2 c                 11    A 00010F90 _TM_SetFileEnd@8     
2 e4 Y6 G# ?7 P! i9 p        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号
6 U( [) p( L2 B' N5 k/ W6 o        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").2 N/ P5 W% E# c
        最后形成.DEF文件如下:
; s" q; D/ O2 \6 n9 `+ B        LIBRARY "VideoDeCoder"
7 B' g# A7 o8 H: B, D! N, O  DESCRIPTION "VideoDeCoder library"' F) _$ k* N! N- L% n. }  \6 E+ ?2 k
  EXPORTS
* k; q( p5 ^* f8 Z$ _$ q: N      
3 O8 y' K* H  U  TM_ClearDecoderBuff@4             @1   
  \! |9 u$ a1 r! T( y3 ~8 A6 r8 C3 L  TM_CloseDecoder@4                 @2    ( H- o$ a0 b, o
  TM_DecodePicture@4                @3   
: e" h% p( }3 d" F  TM_DecodePictureHeader@4          @4    ( J7 S8 f9 y7 E7 r
  TM_GetFileEnd@4                   @5    9 |$ q$ H0 o# g, P$ a. f% a' {
  TM_GetUValue@4                    @6    8 ^4 ]# _6 q$ D; Z
  TM_GetVValue@4                    @7   
1 V. M+ B6 k) w  TM_GetYValue@4                    @8   
1 }3 j/ ~! z/ Q$ {: r  TM_OpenDecoder@8                  @9    + v$ x: b. K& v  V1 G
  TM_ReturnType@4                  @10   
9 [5 c& W$ r3 L. X8 S  TM_SetFileEnd@8                  @11   
; r, a  Z% l- x/ n+ B3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.% P& t7 W+ B# m0 i1 @# i, c3 Z, n6 w0 \# a
EXAMPLE:2 t7 K) r, k0 y! ~/ {
  LIB /DEF:VideoDeCoder.def /MACHINE:IX865 Q+ m5 z8 v- T* f. G
4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:9 m7 X9 C3 |: G
error LNK2002:unresolved external symbol "functionname@nn"
! l5 E: d: {; r提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立
& R- G9 G  h/ FLIB,重新链接即可.) K$ R6 X6 q! v' H
- O- ]6 r6 Q8 |- x
这样就制作成功了符合VC调用方式的LIB了!; r+ r0 F% D* z: n3 O" W- m, J
参考:MSDN2000
: Q5 V8 `! Z+ a# Y" Q) {要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!
  B; j* @* A: O4 y' `% M! SIMPDEF xxx.def xxx.dll7 U) [# r5 P: W2 u! K/ r5 ]/ H
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:" l7 ]+ T/ T7 O' W: ^, W8 M
而在C++BUILDER中!: j% S) K1 w4 b  }" A& x" w
__cdecl的函数输出前会带一"_"
+ e0 B5 w1 p9 J! t$ A) i8 M) S__stdcall无特征,只输出函数名
# |! }# p- `: t& P- B7 R! E__fastcall函数输出前带一"@"3 h9 X' ~5 ~, K3 o. N7 \
都无"@nn"后缀格式!* o% E. |$ Z' m2 r, ~! M" }- T
在VC中!1 W' O( T1 N, P6 d) C. i+ O
__cdecl无特征,只输出函数名
+ }8 e8 b6 E0 X" l" w9 ?* k4 z0 [/ }__stdcall的函数输出前会带一"_"后缀带"@nn"
5 n9 C! v1 U3 r) i- a$ D__fastcall函数输出前带一"@"后缀带"@nn
# ]" T4 e0 [- `- L3 a( F只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-9-30 09:08 , Processed in 0.035361 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表