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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!7 h: T& r5 C. g* i8 T

" ?' z; a: o% V4 B& B% r3 {6 _1. 使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件% \4 O9 }; g, g
EXAMPLE:0 T/ Z, Q' X0 v& o
  DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def/ Y7 S1 K8 T: c2 o. x

( r7 A+ |: F0 Y2. 将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
3 W* m% o1 {. I' B EXAMPLE:$ r- R: k% i( `5 {5 e7 c! Z/ m
  VideoDeCoder.DEF 文件内容如下& _& a, G& O. R
                                                                 
4 I: H5 ^. s* B0 s9 [1 w" c* ~# f        Dump of file VideoDeCoder.dll                                 
7 L. Z& G- L' R' E5 X+ k( W                                                                       
$ W- ~2 W6 [# X- I, E        File Type: DLL                                                 , i9 ?8 Q; j0 J( [1 a4 e: y! c
                                                                       5 O- w/ I6 C! i% P" N& d
          Section contains the following exports for VideoDeCoder.dll  
' G; f: T8 [. {% |6 u/ w4 _6 c                                                                       
" b1 Y9 F: h7 d0 q0 a* u  f& R" d% L                   0 characteristics                                   - N2 f9 H# G( M+ }& k: V
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
% O) `. p" p, y' V1 |6 e                0.00 version                                          
* @' H! ^% E& q, `                   1 ordinal base                                      
7 P" ~3 |# m/ @' x* P                  11 number of functions                              
- Y5 o6 k: W( T6 R+ ?8 [6 N# a' Y                  11 number of names                                   
6 w" F# u+ s" b9 ^" t4 V                                                                       9 U0 l7 v5 F! Z  S5 ]% d
            ordinal hint RVA      name                                 " Y/ ?1 ~0 D0 D
                                                                       
6 Y$ I  {9 O- o  J                  1    0 00010F60 _TM_ClearDecoderBuff@4               + \5 X: A9 N- T! F% L3 a$ y7 F
                  2    1 00010E80 _TM_CloseDecoder@4                   ) G+ @+ `+ c/ V3 s9 }* c! p9 z! I  G
                  3    2 00010F00 _TM_DecodePicture@4                  
: ?% c" T: H; b                  4    3 00010ED0 _TM_DecodePictureHeader@4            
, R" t" h% Y6 z- @/ [' ]2 R! G                  5    4 00010FD0 _TM_GetFileEnd@4                     
. [  A" ]7 K5 G: {                  6    5 00011030 _TM_GetUValue@4                      1 l/ J6 _% [8 B9 \0 h) X: `% n
                  7    6 00011060 _TM_GetVValue@4                     
3 E& j+ G, F" n2 h/ K                  8    7 00011000 _TM_GetYValue@4                      * f7 Y/ N( Z6 W
                  9    8 00010E10 _TM_OpenDecoder@8                    
; u; ]$ n- P3 V2 F$ h$ D                 10    9 00010F30 _TM_ReturnType@4                     . j5 r; \0 ]1 g/ r  e, x: u
                 11    A 00010F90 _TM_SetFileEnd@8                     * e; Q- O- V6 l, B* T$ t5 `
                                                                       
& `. P; |0 C$ v* n$ I2 |) T# t* y          Summary                                                      
. @. T1 h3 I6 t' `3 J8 }4 a; S                                                                       
& f' q9 `0 t. N0 L                2000 .data                                             * V9 ?. Z; e8 [* w# n0 H8 j1 V
                1000 .rdata                                            . n# @3 A# ]! u0 ?
                1000 .reloc                                            
; i7 g6 t. u+ x; w               15000 .text                                             
' h5 x7 s$ F% K1 O0 d; |% o  按照以下方法整理:
& ?& g' Q8 L) h" {- \  1>添加LIB说明0 q3 k2 E+ I: j/ X
   LIBRARY "VideoDeCoder"            ;"xx"为DLL名称* m( Q! V) ]; Z6 l' d% l  z/ E& ]
            DESCRIPTION "VideoDeCoder library"  
* |8 L5 ]% D9 I# k" ^$ q        2>去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数% Z% }, O* [, l
         LIBRARY "VideoDeCoder"
" E0 K) Q. M3 R% Z( U% |   DESCRIPTION "VideoDeCoder library"
2 l$ G4 K$ N* w! f0 b   EXPORTS5 H: \- D6 E4 Z% s6 p
            ordinal hint RVA      name                          
7 {9 v, [4 ^; q, K( |4 ~4 _9 D                                                                6 S. E1 L9 U8 y, m+ F
                  1    0 00010F60 _TM_ClearDecoderBuff@4            
+ |4 u& R& t# c, G' m7 x/ z9 ]                  2    1 00010E80 _TM_CloseDecoder@4            
, L2 h1 i! a" w0 p' i/ b                  3    2 00010F00 _TM_DecodePicture@            
7 ~( _8 j, g8 _                  4    3 00010ED0 _TM_DecodePictureH            2 F- u: {. v% z% i$ O( X
                  5    4 00010FD0 _TM_GetFileEnd@4              9 [  c& K% Z5 _% ]+ m, n
                  6    5 00011030 _TM_GetUValue@4               % W; s/ N$ C( O3 |! H) N7 B% {* {
                  7    6 00011060 _TM_GetVValue@4               
* h& b8 K+ M5 W1 T9 x  ^; j+ c7 f                  8    7 00011000 _TM_GetYValue@4               5 P( U+ @. Y# m+ Q$ R9 K
                  9    8 00010E10 _TM_OpenDecoder@8             3 b4 d$ o- V1 {+ {7 X8 H
                 10    9 00010F30 _TM_ReturnType@4              
  k$ ]- m  ]& @8 a( P2 M. ^" Y                 11    A 00010F90 _TM_SetFileEnd@8     
/ G# F) A1 n) O1 x) m1 E        3>将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号# B& ?5 F; _+ W8 s. D& g3 d
        形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和").$ P+ b5 ^3 `7 s& j
        最后形成.DEF文件如下:
+ a1 r6 ~6 Z! X) I5 S        LIBRARY "VideoDeCoder"
2 _5 [' ?/ X% [& \# ]9 B. i5 o  DESCRIPTION "VideoDeCoder library"- \2 X0 E# j3 t  B
  EXPORTS" j5 T. `' t4 w0 L: d- y- j9 b
      
) c( A5 [# w0 J& |; ^3 T  TM_ClearDecoderBuff@4             @1   
1 m$ E2 r5 a1 _8 D5 p  TM_CloseDecoder@4                 @2    & H5 _6 f3 _# C9 \+ W
  TM_DecodePicture@4                @3   
; a2 s3 T0 H( R* F; y( {: k/ P7 x  TM_DecodePictureHeader@4          @4   
: h+ D( s- k4 ]. `  x  TM_GetFileEnd@4                   @5    ) W' \. M& q5 u% {7 D& s
  TM_GetUValue@4                    @6    4 G" M2 r) p+ e$ r; c3 P2 T4 Y
  TM_GetVValue@4                    @7    , t, B+ W5 j" w: q) O: k
  TM_GetYValue@4                    @8   
/ s) e( ~, q- M- P7 u  TM_OpenDecoder@8                  @9    % X% t, Q1 a4 o- v" b1 L5 n
  TM_ReturnType@4                  @10    0 x$ ]8 U2 T, g' a, z
  TM_SetFileEnd@8                  @11   
1 w! ?. f. q4 _. m% m3. 使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.; m) V& f$ q2 t4 x
EXAMPLE:  Q/ z  f1 [0 v1 l  h
  LIB /DEF:VideoDeCoder.def /MACHINE:IX86
0 y$ G" L& g0 |/ N0 @4. 接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
: v) p: |3 s4 V' [8 f: l7 {/ J error LNK2002:unresolved external symbol "functionname@nn"
# `, n& B+ N0 r7 v( J6 c7 u/ I3 t提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立  Z" U8 p5 Z3 l# t/ Q! G
LIB,重新链接即可.
/ Q( g: C! z8 ]7 j( C, F+ D- o; R5 I8 X' k3 i, I9 g  e
这样就制作成功了符合VC调用方式的LIB了!
! N& G, ?" V: p3 e参考:MSDN20005 \8 G9 [4 D6 t) ^
要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,只要做一点点修改就可以成为符合VC的DEF文件!: V5 t* v; _& A# o5 d: }' e
IMPDEF xxx.def xxx.dll4 |- W; H; C3 B* e+ g
这种方法只能应用于输出为C格式的__stdcall调用方式经过我的论证有些错误!我利用Borland C++和VC++做论证,发现:
- Q) M5 m% K0 S% ]而在C++BUILDER中!
0 u6 b* W4 O, V' T- f__cdecl的函数输出前会带一"_": o8 t# X/ f& {' G1 o& U+ g8 e
__stdcall无特征,只输出函数名
/ J& c6 E" c0 w  Q: S; N2 r__fastcall函数输出前带一"@"' e: S$ W% v  v6 T( q' A
都无"@nn"后缀格式!6 ^  B4 A6 Z* z: f( S: L
在VC中!
2 D' p: k/ J4 B, F__cdecl无特征,只输出函数名4 A% Z1 `( c" l# |$ r- M" }: W8 `
__stdcall的函数输出前会带一"_"后缀带"@nn"0 m5 b+ o7 k: n' F: C
__fastcall函数输出前带一"@"后缀带"@nn% d' L/ I( n" |. o, z
只要将BC的DEF文件中函数申明格式转换为VC识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:55 , Processed in 0.019371 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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