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

 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

转载于:https://www.cnblogs.com/ziolo/p/3421962.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、groupadd benetgrp2. useradd -g benetgrp benet3, mkdir -p /var/www/beneta, chown benet /var/www/benet ; chmod urwx /var/www/benetb, chown :benetgrp /var/www/benet或者chgrp benetgrp /var/www/benet; chmod grx /var…

清除浮动的7种方法

使用display&#xff1a;inline-block会出现的情况&#xff1a; 1.使块元素在一行显示 2.使内嵌支持宽高 3.换行被解析了 4.不设置的时候宽度由内容撑开 5.在IE6,7下步支持块标签 由于inline-block属性换行的时候被解析&#xff08;有间隙&#xff09;故解决方法使用浮动float:…

linux gst qt,【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结

1,gstreamer开发手册&#xff0c;gstreamer官网(这些都不用说了吧)2&#xff0c;gst-launch的用法&#xff0c;这也不用说了吧。(白菜&#xff0c;鸡蛋&#xff0c;西红柿&#xff0c;砖头&#xff0c;鼠标……..)lqplayer--基于gstreamer和qt的Linux下的简单播放器。实现了基于…

背后的故事之 - 快乐的Lambda表达式(二)

快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式&#xff08;一&#xff09;我们由浅入深的分析了一下Lambda表达式。知道了它和委托以及普通方法的区别&#xff0c;并且通过测试对比他们之间的性能&#xff0c;然后我们通过IL代码深入了解了Lambda表达式&#x…

linux用vsc写c语言,vscode写c语言(windows)

用vscode学习c语言。记录vscode配置c语言编译环境。1.安装vscode(版本1.27)2.安装c/c扩展。配置环境变量&#xff0c;以WIN10为例 &#xff0c;此电脑-属性-高级系统设置-环境变量-系统变量-path-添加一条D:\Program Files\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw3…

mouseevent tips

关于roll_over 和 mouse_over的区别&#xff0c;这篇文章说明的很清楚&#xff0c;http://zengrong.net/post/1105.htm 全文如下&#xff1a; 在MouseEvent中&#xff0c;ROLL_OVER和MOUSE_OVER、ROLL_OUT和MOUSE_OUT是两对比较相似的事件&#xff0c;它们有什么区别呢&#xf…

mt3 linux外网搭建,MT3 换皮梦幻 Linux端架设文字教程

1.安装宝塔yum install -y wget && wget -O install.shhttp://download.bt.cn/install/install.sh&& shinstall.sh获取宝塔地址 账号 密码开放端口10030 10011 10020 10003宝塔安装网站环境n1.14 mysql 5.6 php5.4关闭防火墙&#xff0c;我是7系统&…

一个有关数组的题

//在这里插入代码片import java.util.*; 1. (A rookie learning Java)写的一个有关数组的题 定义一个长度为10的整型数组&#xff0c; 循环输入10个整数然后判断这个数组中有几个偶数&#xff0c; 再定义一个正好能存放这几个偶数的数组&#xff0c; 将上一个数组中的所有偶数…

onCreateOptionsMenu

onCreateOptionsMenu----只在Activity创建时调用一次&#xff01;之后不会再被调用&#xff01;onPrepareOptionsMenu----每次display menu之前&#xff0c;都會调用该方法&#xff0c;  只要按一次menu按鍵&#xff0c;就會调用一次。  所以你會發現每次只要按一次menu按鍵…

linux识别UDF文件系统吗,Linux Kernel UDF文件系统本地缓冲区溢出漏洞

发布日期&#xff1a;2012-07-04更新日期&#xff1a;2012-07-05受影响系统&#xff1a;Linux kernel 3.3.x描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 54279Linux Kernel是Linux操作系统的内核。Linux K…

程序编译时书写Makefile注意事项一例

在进行程序编译时&#xff0c;可能需要指定一些库的库的路径、头文件的路径&#xff0c;分别使用的参数选项是-L和-I&#xff0c;需要注意的是&#xff1a;需要确保-L和-I后边的内容不为空&#xff0c;否则会出现意想不到的错误&#xff0c;而这种错误比较难以发现&#xff0c;…

把一个数组分为多个数组

/*int[]arr{1,2,5,213,75,42,64,48,21,44,22}; 分为3个数组 第一个数组满足全是偶数 第二个数组满足全是3的倍数 第三个数组满足其他*/ public class E{public static void main(String[]args){int[]arr{1,2,5,213,75,42,64,48,21,44,22};int b0,c0,d0;//遍历数组,得到每个数组…

window的war发布Linux失败,为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?...

最近项目完成后打包成war发布到服务器遇到访问应用404问题&#xff0c;用的是tomcat8.5&#xff0c;错误信息如下&#xff1a;o.s.b.w.servlet.support.ErrorPageFilter : Cannot forward to error page for request [/login] as the response has already been committed. As…

linux 命令行模式下,浏览网页方法

Ubuntu自带最新版的Gnome桌面&#xff0c;拥有大量的服务和桌面应用程序&#xff0c;让您仅通过一张安装光盘就可以体验到无比舒适的操作环境。下文介绍的在ubuntu下使用终端命令行上网的方法。 第一步&#xff0c;需要安装一个名为w3m的软件工具&#xff0c;打开终端&#xff…

数组的增删

public class A {public static void main(String[] args) {int[] arr { 1, 2, 5, 23, 64, 9, 87, 99 };// 要求删除23int index -1;int num 23;for (int i 0; i < arr.length; i) {if (num arr[i]) {index i;}}for (int i index 1; i < arr.length; i) {arr[i -…

linux就业技术指导,学linux前景怎么样

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼青海华夏职业学校09年招生简章221.207.32.* 1楼青海华夏职业技术中等专科学校概况&#xff1a;青海华夏职业技术中等专科学校是由青海省教育厅备案并批准成立的一所中等层次的职业技术专修学校。学校坐落在青海省西宁市美丽的南川河…

获取Android版本信息和电话信息

Android的版本信息可以通过android.os.Build获得&#xff0c;电话信息可以通过TelephonyManager获得&#xff0c;代码如下&#xff1a; private void get_infor(){sdk android.os.Build.VERSION.SDK;;release android.os.Build.VERSION.RELEASE;user android.os.Build.USER;…

简单的二维数组

/*找人,找到输出在第几楼第几号房间&#xff08;考虑没有找到的情况&#xff09;*/ /*{{"凤姐","蔡除坤","张洁"},{"姚鸣","芙蓉姐姐"},{"马尔克死","打仲马","肝塞特","高死你"}}…

求e的c语言程序,(C语言)计算e的x次方

计算e的x次方题目&#xff1a;编写程序&#xff0c;计算ex1x(x2)/(2!)(x3)/(3!)(x4)/(4!)…(x^n)/n!说明&#xff1a;e^x表示e的x次方&#xff0c;2!表示2的阶乘输入输出格式要求&#xff1a;输入格式&#xff1a;x n回车e^x, x, n均用double类型存储。要求输出小数点后6位。只…