Windows是一个不断发展的系统,很多新的 API 在操作系统更新时更新,而MASM32开发包一般在很长一段时间内都无法及时更新,如果需要在编程中使用新添加的API函数。就得自己动手来更手库文件,下面我就给大家介绍一下如何通过手动的方法添加新的 API。为了便于说明,我们以 GetConsoleWindow 这个API为例。这个函数能够取得当前程序所在控制台的句柄。具体说明请参考后面的注释。MasmPlus 已经定义了这个函数,在你敲入函数名时会自动弹出提示:
但是,在编译中会出现无法识别的错误,这是因为 MASM32 包这个函数根本没有引用,在对应的LIB中缺少声明,我们的编译器不认识它。
如果这个函数权权只是没有声明,那在你的代码中使用:
GetConsoleWindow PROTO :DWORD.....
声明就可以。有多少个参数就有多少个DWORD。还需要引用目录库文件,比如INCLUDE xxx.lib ;如果说LIB中也没有,那要使用LIB工具成生LIB。首先要知道GetConsoleWindow 函数在哪个DLL中。在 MSDN 中搜索到这个函数,在 QUICK INFO中,可以看到它所在的DLL是哪一个.
假设为Kernel32.dll,然后,新建一个kernel32.inc 的文档,注意文件名必须和目标函数所在DLL一样,在里面加入:
GetConsoleWindow PROTO :DWORD....
具体参数有多少个,参考MSDN。同时,要把其它的函数都添加好。否则生成的库文件只有一个函数引用。比如,原本就有一个kernel32.inc的文档,只是没有这个函数的声明,那就直接添加到已有的inc里面,如果是不存在的函数,在导出时,会显示错误,但不会停止。然后使用MASM32包里面的 INC2L.exe ,直接调用加上参数就可以生成Kernel32.lib,如:inc2l kernel32.inc
要注意的是,inc2l也是使用ml和link来建立库的,所要要保证环境中能找到它们。可以使用inc2l /?来查看帮助。它的要求是,使用环境变量 set mdir=drv:\path来确定link在哪里。
这里处理完了,如果需要在MASMPlus中能够列出函数原型,还需要添加到安装目录下的Files\keywords.stx这个文档中。打开后找到API所在的段如:#KEY10,添加格式为:
GetConsoleWindow==hConsole,lpsss......
这里也是按MSDN而来。如果没有参数,直接留空。如果一个函数需要在输入时列出一些常数,可以写为下面的格式:
GetConsoleWindow==hConsole,fFlags[GCW_]
意思是在 MASMPlus 输入时,在GetConsoleWindow的第二个参数时,列出所有以GCW_开头的常数。如果还有UNICODE和ANSI之分,参数个数都是一样的,可以使用转向:
GetConsoleWindowA==<GetConsoleWindow>
GetConsoleWindowW==<GetConsoleWindow>
意思是无论是GetConsoleWindowA还是GetConsoleWindowW,都使用与GetConsoleWindow相同的设置。
实际操作:
1.首先在MSDN上查找 GetConsoleWindow ,上面指出该API存在于 Kernel32.Lib中。
2.打开\MASMPlus\Include\ kernel32.inc,发现其中并没有定义这个函数。
我们尝试在程序中直接声明
编译仍然有错误
这时我们就要尝试在 Kernel32.LIB 中添加内容。
3.在打开的kernel32.inc末尾添加如下代码:
GetConsoleWindow PROTO
然后将 kernel32.inc 拷贝到有inc2l.exe工具的目录下,我机器上这个工具位于
E:\masm32\tools\INC2L 目录下,使用 inc2l kernel32.inc 生成kernel32.lib
4.将生成的kernel32.lib拷贝到\MASMPlus\Lib目录下覆盖掉原来的即可。
最终重新编译我们的程序(程序中不需要声明)通过。
上面只是演示如何声明一个库中没有的函数,至于如何设置自动提示的功能,请读者自己回去试演。
参考1:http://msdn2.microsoft.com/en-us/library/ms683175.aspx
参考2:本文使用的程序例子
;#Mode=CON
;MASMPlus 单文件代码模板 - 控制台程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data?
buffer db 100 dup(?)
.CODE
START:
invoke GetConsoleWindow
invoke ShowWindow,eax,SW_MINIMIZE
;暂停显示,回车键关闭
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START
以上为装载内容,请尊重原作者的辛勤劳动。装载请注明出处。谢谢:
原出处:http://www.aogosoft.com/downpage.asp?mode=viewtext&id=138