如何使用一个库中不存在的函数

 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中能够列出函数原型,还需要添加到安装目录下的Fileskeywords.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.打开MASMPlusInclude kernel32.inc,发现其中并没有定义这个函数。

  我们尝试在程序中直接声明

  

  编译仍然有错误

  

  这时我们就要尝试在 Kernel32.LIB 中添加内容。


3.在打开的kernel32.inc末尾添加如下代码:

  GetConsoleWindow PROTO

  然后将 kernel32.inc 拷贝到有inc2l.exe工具的目录下,我机器上这个工具位于
E:masm32 oolsINC2L 目录下,使用 inc2l kernel32.inc 生成kernel32.lib

  

4.将生成的kernel32.lib拷贝到MASMPlusLib目录下覆盖掉原来的即可。
  
  最终重新编译我们的程序(程序中不需要声明)通过。

  上面只是演示如何声明一个库中没有的函数,至于如何设置自动提示的功能,请读者自己回去试演。

参考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

原文地址:https://www.cnblogs.com/ziolo/p/3421962.html