zoukankan      html  css  js  c++  java
  • 如何使用一个库中不存在的函数

     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

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/ziolo/p/3421962.html
Copyright © 2011-2022 走看看