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

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

[复制链接]
发表于 2007-12-20 11:00:22 | 显示全部楼层 |阅读模式
请大家注意!这种方法只能应用于输出为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的链接错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:27 , Processed in 0.019028 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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