为Dll重新构造Lib

分类: Windows Repository 2010-06-12 12:56 1151人阅读 评论(0) 收藏 举报
dllmicrosoft正则表达式variables工具文本编辑
有些时候, 我们手头只有.dll和.h文件, 没有.lib. 而VC链接必须要提供.lib. 我们可以通过本文描述方法快速生成*.lib文件.

我们需要以下三步来为任意dll生成lib:

(1) 工具dumpbin.exe生成*.def文件
(2) 编辑*.def文件以满足工具lib.exe的需要
(3) 工具lib.exe生成*.lib

我们先对所涉及的工具程序dumpbin.exe和lib.exe做一简单描述:

dumpbin.exe和lib.exe随微软集成开发平台发布, 编译环境安装后在如下路径查找:
  (A) VS2010: 位于安装目录下的VC/bin中. 同时需要mspdb100.dll, 该dll位于安装目录下的Common7/IDE文件夹.
        例如, 我安装VS2010在D:/Program Files/Microsoft Visual Studio 10.0下, 则两者目录分别如下:
                 D:/Program Files/Microsoft Visual Studio 10.0/VC/bin
                 D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE
  (B) VC++6.0: 位于安装目录下的VC98/Bin中. 同时需要mspdb60.dll, 该dll位于安装目录下的Common/MSDev98/Bin文件夹.
        例如, 我安装VC++6.0在D:/Program Files/Microsoft Visual Studio下, 则两者目录分别如下:
                 D:/Program Files/Microsoft Visual Studio/VC98/Bin
                 D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin

为了方便在路径下不带工具程序全路径, 我们需要设置环境变量. 如下:

XP-EN-SP3版本下选择MyComputer-->Properties-->Advanced-->Enviroment Variables.
如果只想对当前用户生效, 则添加在 User Variables for username. 想对全部用户生效, 则添加在System Variables项.
使用逗号分隔每一项. 例如, 我设置只对当前用户有效, 针对VS2010的更改:
                 D:/Program Files/IDM Computer Solutions/UltraEdit/;D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/;D:/Program Files/Microsoft Visual Studio 10.0/VC/bin/
对于中文XP, 应该是: 我的电脑-->属性-->高级-->环境变量. 然后更改用户变量或者系统变量. 方式同英文版.

现在, 我们可以在任意目录下执行它们了, 请直接选择Start–>Run(中文为开始–>运行), 输入cmd进入命令行环境, 输入dumpbin或者lib. 如果输出找不到, 则表示上述设置有问题, 请详细检查. 如果正常, 则输出为两者的帮助信息.

我们以gdi32.dll(位于C:/WINDOWS/system32目录下)为例来说明. 选择Start–>Run, 输入cmd进入命令行环境.

  1. 用工具软件dumpbin.exe生成gdi32.def
    执行:
    dumpbin /exports C:/WINDOWS/system32/gdi32.dll > E:/gdi32.def
    进入E:盘查看, 应该有gdi32.def文件. 内容大致如下(开始和结尾部分):

[c-sharp] view plaincopy
Microsoft ® COFF/PE Dumper Version 10.00.30319.01
Copyright © Microsoft Corporation. All rights reserved.
Dump of file C:/WINDOWS/system32/gdi32.dll
File Type: DLL
Section contains the following exports for GDI32.dll

00000000 characteristics  
48025C4E time date stamp Mon Apr 14 03:17:34 2008  
    0.00 version  
       1 ordinal base  
     610 number of functions  
     610 number of names  
ordinal hint RVA      name  
      1    0 00034A05 AbortDoc  
      2    1 00035D39 AbortPath  
      3    2 0002F4DF AddFontMemResourceEx  
      4    3 0001A005 AddFontResourceA  
      5    4 0001A01F AddFontResourceExA  
      6    5 0002FCCF AddFontResourceExW  
      7    6 0002FB82 AddFontResourceTracking  
      8    7 0002FCB5 AddFontResourceW  
      9    8 00034D9C AngleArc  
     10    9 0002CECE AnimatePalette  
     11    A 00041AE7 AnyLinkedFonts  
     12    B 00034E4E Arc  
     13    C 00034F3A ArcTo  

// … escaped content here …
// … escaped content here …

    600  257 00035F01 WidenPath  
    601  258 0001FE43 XFORMOBJ_bApplyXform  
    602  259 0001CD41 XFORMOBJ_iGetXform  
    603  25A 000425E7 XLATEOBJ_cGetPalette  
    604  25B 0004260F XLATEOBJ_hGetColorTransform  
    605  25C 000425FB XLATEOBJ_iXlate  
    606  25D 00039929 XLATEOBJ_piVector  
    607  25E 0000CCB0 bInitSystemAndFontsDirectoriesW  
    608  25F 0000CC01 bMakePathNameW  
    609  260 0000CB0A cGetTTFFromFOT  
    610  261 000348BA gdiPlaySpoolStream  

Summary

    2000 .data  
    2000 .reloc  
    1000 .rsrc  
   43000 .text  

完成. 按照第2步描述修改这个文件.
  1. 修改gdi32.def以满足工具lib的要求
    (A) 删除文件头和文件尾(用纯文本编辑器打开, 如notepad或wordpad或Editplus或者UltraEdit均可)
    如下为文件头部删除的部分:
    

[c-sharp] view plaincopy
Microsoft ® COFF/PE Dumper Version 10.00.30319.01
Copyright © Microsoft Corporation. All rights reserved.
Dump of file C:/WINDOWS/system32/gdi32.dll
File Type: DLL
Section contains the following exports for GDI32.dll

00000000 characteristics  
48025C4E time date stamp Mon Apr 14 03:17:34 2008  
    0.00 version  
       1 ordinal base  
     610 number of functions  
     610 number of names  
ordinal hint RVA      name   

    如下为文件尾部删除的部分:

[c-sharp] view plaincopy
Summary

  2000 .data  
  2000 .reloc  
  1000 .rsrc  
 43000 .text   

    如下为剩余部分(只包括剩余部分的开始和结尾部分内容):

[c-sharp] view plaincopy

  1    0 00034A05 AbortDoc  
  2    1 00035D39 AbortPath  
  3    2 0002F4DF AddFontMemResourceEx  
  4    3 0001A005 AddFontResourceA  
  5    4 0001A01F AddFontResourceExA  
  6    5 0002FCCF AddFontResourceExW  
  7    6 0002FB82 AddFontResourceTracking  
  8    7 0002FCB5 AddFontResourceW  
  9    8 00034D9C AngleArc  
 10    9 0002CECE AnimatePalette  
 11    A 00041AE7 AnyLinkedFonts  
 12    B 00034E4E Arc  
 13    C 00034F3A ArcTo  

// … escaped content here …
// … escaped content here …

600  257 00035F01 WidenPath  
601  258 0001FE43 XFORMOBJ_bApplyXform  
602  259 0001CD41 XFORMOBJ_iGetXform  
603  25A 000425E7 XLATEOBJ_cGetPalette  
604  25B 0004260F XLATEOBJ_hGetColorTransform  
605  25C 000425FB XLATEOBJ_iXlate  
606  25D 00039929 XLATEOBJ_piVector  
607  25E 0000CCB0 bInitSystemAndFontsDirectoriesW  
608  25F 0000CC01 bMakePathNameW  
609  260 0000CB0A cGetTTFFromFOT  
610  261 000348BA gdiPlaySpoolStream  

    保存更改后的文件.
 (B) 函数行更改. 对于每行函数, 只保留第四列(name列).
    如果只有三五行导出函数, 可能手工更改是最快的. 当导出函数数量较多时(例如gdi32.dll中有610个), 手工更改每行有些没效率, 也有些乏味. 当然, 如果工资是以小时计算的, 在心情不爽时按行删除也是一个消遣.
    此处我们使用正则表达式处理, windows下本身没有支持正则的纯文本编辑器或者程序. 我们使用Editplus来完成. 如下:
    Editplus官方网站是:
           http://www.editplus.com/download.html
    或者直接从链接下载Editplus3.12 trial:
           http://www.editplus.com/ep2setup-en.cgi
    如果想长期使用, 可以按照csdn资源所说进行破解, 该资源由resource_shared 发布(我们表示感谢), 链接地址为:
           http://download.csdn.net/source/2435679
    用Editplus打开E:/gdi32.def文件, 选择Ctrl+H或者Search-->Replace, 进行替换. 替换对话框Regular Expression前打钩(选中),
           FindWhat内输入下行中括号内内部分(不含中括号), 注意, 前后均有一个空格.
                           [ *[0-9]+ +[0-F]+ +[0-F]* ]
           Replace With输入四个空格.
           选择Replace All.
           我们抽点时间描述下上述正则表达式含义: 上述正则表达式匹配符合如下要求的行:
              以任意空格分隔的三列.
              第一列是任意个十进制数字
              第二列和第三列是任意个十六进制数字
              第一列前空格可以为0个或者多个
              第一列和第二列之间, 第二列和第三列之间, 有1个或者多个空格
           而 dumpbin 生成的.def文件内, 每个导出函数, 均由空格分隔的如下四部分构成:
              [    ordinal  hint  RVA      name ]
           其中,
                   ordinal 是序号, 依次递加(从0开始,10进制表示)
                   hint 是其在Name表中的位置,依次递加(0开始,16进制表示)
                   RVA 是相对虚拟地址
                   name 是函数名称.
           可见, 我们的替换操作将匹配每行的前三列, 将替换前三列为四个空格.
           此时文件内容大致如下:

[c-sharp] view plaincopy
AbortDoc
AbortPath
AddFontMemResourceEx
AddFontResourceA
AddFontResourceExA
AddFontResourceExW
AddFontResourceTracking
AddFontResourceW
AngleArc
AnimatePalette
AnyLinkedFonts
Arc
ArcTo
// … escaped content here …
// … escaped content here …
WidenPath
XFORMOBJ_bApplyXform
XFORMOBJ_iGetXform
XLATEOBJ_cGetPalette
XLATEOBJ_hGetColorTransform
XLATEOBJ_iXlate
XLATEOBJ_piVector
bInitSystemAndFontsDirectoriesW
bMakePathNameW
cGetTTFFromFOT
gdiPlaySpoolStream

           在文件头添加如下两行:

[c-sharp] view plaincopy
LIBRARY “gdi32.dll”
EXPORTS

 保存文件, 我们进入第3步
  1. 用工具软件lib.exe生成gdi32.lib
    执行:
    lib /machine:x86 /def:E:/gdi32.def /out:E:/gdi32.lib
    进入E:盘查看, 应该已经有gdi32.lib文件. 同时有gdi32.exp文件.

OK, 现在, 我们可以用lib和exp执行链接了.

你可能感兴趣的:(为Dll重新构造Lib)