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


     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

  • 相关阅读:
    灰度发布
    rabbitmq应用场景
    redis设置cpu核数与内存
    使用word2010发布博客到博客园
    讲师
    UML-6.3-用例-详述示例
    UML-6.2-用例-用例模型/用例/场景关系
    UML-6.1-用例-示例
    数据库增量同步开源软件
    UML-5-进化式需求
  • 原文地址:https://www.cnblogs.com/ziolo/p/3421962.html
Copyright © 2020-2023  润新知