分类: 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进入命令行环境.
[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步描述修改这个文件.
如下为文件头部删除的部分:
[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步
OK, 现在, 我们可以用lib和exp执行链接了.