win32 API 调用方法

invoke 语句

我们在MASM中可以用这种方法来调用API函数:invoke  函数名 [参数1],[参数2] ,......  。这样可以避免我们在写汇编程序中调用函数时少写或漏写了参数,漏写参数会导致堆栈对不齐,但是这样的程序在编译链接时并不会报错,但执行的时候程序会崩溃。而用这种方法就像在c语言中调用函数一样,如果我们漏写了参数,编译器会报错,就可以避免上面的情况发生。编译器报错内容是:error A2137 : too few arguments to INVOKE  。就是参数少了的意思。使用invoke的例子:

invoke MessageBox NULL,offset szText,offset szCaption,MB_OK

最后那个MB_OK表示窗口类型,具体什么类型稍后再介绍,其他的参数都很熟悉了,标题,内容。

API函数声明和返回值,include,includelib语句

  有的API函数也和c++中的一些函数一样会有返回值,返回值如果是deword类型,那么将永远放在EAX中,如果返回的内容EAX容纳不下那么将返回一个指针,这个指针指向返回数据。

  和c语言很像,win32 API在调用之前也需要先声明,否则编译器不认识这个函数。声明的格式:函数名  proto  [距离] [语言] [参数1]:数据类型 [参数2]:数据类型......

  声明的格式其实和c语言中声明的格式有相同之处,也要指定参数类型,也要学出写出函数名,但是和C语言有不同的地方就是win32API的参数名可以省略,可以只用写参数类型,而win32API的参数类型又只使用deword的类型,所以比如我们的messagebox函数的声明就是:MessageBox Proto :deword,:dword,:dword.:dword

  有时候我在使用OD寻找messagebox函数时会看到有两个这样的函数:MessageBoxA  MessageBoxW  。这两个是有区别的,后面接A的是用来处理ANSI字符集的,也就是只占一个字节的数据,像英文字符就是只占一个字节,而后面接W的就是用来处理占两个字节的Unicode字符型数据的,比如中文。

  有时候在OD中查看汇编代码时能看到messagebox这个函数,但是在user32.dll中只有MessageBoxA和MessageBoxW,并没有叫MessageBox的函数,但是为什么我们有时候在编写源代码时又能使用MessageBox呢?如果我们到程序头文件user32.inc中去查看就能看到一句话:MessageBox equ <MessageBoxA>  这句话的意思是将MessageBox替换成MesageBoxA,这样我们每次用MessageBox就是默认使用了带A的。那么,这个程序头文件是什么呢?我们这样来介绍一下。首先,如果我们每要调用一个函数,就声明一次的,未免太麻烦了,并且有的函数的参数很多,所以又出了一种使调用函数更简单的方式,就和c语言中引入头文件一样:include  头文件名。头文件中有被包含的函数的声明,这样我们要用声明什么函数,就是直接把函数对应的头文件给包含进来,然后就不用自己声明就可以直接使用了。每一个DLL对应一个头文件:<DLL名.inc >,在masm32 sdk中已经包含所有DLL的API声明列表,所以我们想用什么可以直接包含进来。比如我们要把user32.dll中的函数声明的头文件包含进来:include user32.inc  。对于编译器而言,它会将这句话替换成指定文件的内容。我们也可以像c语言一样,写一个文件,然后用include把文件包含进来,就可以使用文件里的东西了。如果文件名和一些关键字同名的话,我们可以用<>将文件名括起来。

我们再来看一下一个WIN32源文件:

 

我们可以看到它的include文件定义部分,除了有include还有includelib ,其实思考一下就会知道,include 只是把函数声明包含进来,而我们还没有真正把函数给弄进来,而那个includelib 就是做这个的,准确地说是把对应的DLL的导入库文件给包含进来。要解释的话就要说到以前的使用中断方式调用系统功能的汇编,这个时候的汇编也有库函数的概念,但这个时候的调用为静态调用,就是在最后链接成可执行文件的时候,link 程序直接从库里面把相应的函数的代码一起链接成最后的可执行文件。而现在的WIN32汇编是动态调试的方式,库文件中存放的不是函数的代码(函数现在在DLL文件中),而是函数的定位信息和参数目录等其他一些简单的信息,现在这种库文件叫做导入库,并且一个DLL文件对应一个导入库文件,如user32.dll对应的导入库文件是user32.lib,并且includelib也不是在链接的时候将导入库文件里的内容直接链接进来,而是告诉链接器在链接的时候,到指定的库文件中去找API函数的位置信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值