这篇短文是讲述关于建立masm导入库(import libraries)技巧,我假设你已经知道什么是导入库.在下面,我将集中讲述建立masm导入库的方法. 【程序编程相关:ActionScript 中的所有关键字】
by iczelion (翻译:花心萝卜yqzq@163.net) 9.5.2000 【推荐阅读:发现了一个论坛】
masm与vc++可以使用相同的导入库,ms导入库使用不同于tasm的omf格式的变更的coff文件格式,这就是为什么tasm与masm的导入库不能互用的原因,我将不详细介绍有关ms导入库的格式.可以这样说,每一个ms导入库都包含某个dll中函数的信息(你将要用这些信息来调用dll中的函数),这些信息包括函数名与它所有参数的尺寸.如果你用一个文本编辑器打开kernel32.lib,你回发现一些如下格式的信息:_exitprocess@4 【扩展信息:ActionScript 中的所有关键字】
masm导入库的格式:
_createprocessa@40 函数名被装饰上了一个“_”,在“@”之后的数字表示了该函数所有参数的尺寸(字节为单位),exitprocess 函数只有一个dword的参数,所以后面的数字是4. lib中为什么要包含这些参数尺寸的信息呢?当你用invoke调用函数时,这些信息被用来检测传递给函数的参数是否正确.如果你使用“手工”将参数压入堆栈,并通过“call”来调用函数的话,masm将无法检测参数是否正确.这将导致我们几乎没有办法建立一个dll的导入库,因为dll并不包含清楚的关于参数尺寸的信息.从dll建立masm导入库
如果你很乐意用“手动”(call)的方法去调用函数的话,你可以象下面这样为任何一个dll建立masm的导入库: 使用dumpbin.exe,它可以导出dll 输出(export)函数的名字. dumpbin /exports blah.dll > output.txt 在你获得了函数名列表之后,通过他们建立一个模块定义文件(.def). 举个例子:如果dll只包含一个函数:getsomeline 在一个文本文件中输入如下内容: library blah exports getsomeline 并将其保存为“blah.def 象这样,运行lib.exe,通过模块定义文件建立一个导入库: lib /def:blah.def就是它了!你将获得blah.lib,只要你不使用invoke调用函数的话,你就可以在masm中使用它.... 下一页