当前位置:鱼C工作室 >Win32汇编 > 查看文章

使用MASM05 – Win32汇编语言013

使用MASM05

 

让编程改变世界

Change the world by program


 

函数的声明

 

在调用API函数的时候,函数原型也必须预先声明,否则,编译器会不认这个函数。invoke伪指令也无法检查参数个数。声明函数的格式是:

函数名 proto [距离] [语言] [参数1]:数据类型, [参数2]:数据类型

 

句中的proto是函数声明的伪指令,距离可以是NEAR,FAR,NEAR16,NEAR32,FAR16或FAR32。

Win32中只有一个平坦的段,无所谓距离,所以在定义时是忽略的;语言类型就是.model那些类型,如果忽略,则使用.model定义的默认值。

 

对Win32汇编来说只存在dword类型的参数,所以所有参数的数据类型永远是dword。

另外对于编译器来说,它只关心参数的数量,参数的名称在这里是无用的,仅是为了可读性而设置的,可以省略掉。

 

所以下面两句消息框函数的定义实际上是一样的:

MessageBox Proto hWnd:dword, lpText:dword, lpCaption:dword, uType:dword

MessageBox Proto :dword, :dword, :dword, :dword

 

在Win32环境中,和字符串相关的API共有两类,分别对应两个字符集:一类是处理ANSI字符集(1B)的,另一类是处理Unicode字符集(2B)的。

前一类函数名字的尾部带一个A字符,处理Unicode的则带一个W字符。

我们比较熟悉的ANSI字符串是以NULL结尾的一串字符数组,每一个ANSI字符占一个字节宽。

对于欧洲语言体系,ANSI字符集已足够了,但对于有成千上万个不同字符的几种东方语言体系来说,Unicode字符集更有用。

 

MessageBox和显示字符串有关,同样它有两个版本,严格地说,系统中有两个定义:

MessageBoxA Proto hWnd:dword, lpText:dword, lpCaption:dword, uType:dword

MessageBoxB Proto hWnd:dword, lpText:dword, lpCaption:dword, uType:dword

 

虽然《Microsoft Win32 Programmer’s Reference》中只有一个MessageBox定义,但User32.dll中确确实实没有MessageBox,而只有MessageBoxA和MessageBoxW,那么为什么还是可以使用MessageBox呢?Follow

由于并不是每个Win32系统都支持W系统的API,例如在Windows 9x系列中,对Unicode是不支持的,很多的API只有ANSI版本,只有Windows NT系列才对Unicode完全支持。

为了编写在几个平台中通用的程序,一般应用程序都使用ANSI版本的API函数集。

这样的话,为了使程序更有移植性,在源程序中一般不直接指明使用Unicode还是ANSI版本,而是使用宏汇编中的条件汇编功能来统一替换。

 

如在源程序中使用MessageBox,但在头文件中定义:

if UNICODE
       MessageBox    equ   <MessageBoxW>
else
       MessageBox    equ   <MessageBoxA>
endif

 

所有涉及版本问题的API都可以按此方法定义,然后在源程序的头指定UNICODE=1或UNICODE=0,重新编译后就能产生不同的版本。

 

include语句

 

对于所有要用到的API函数,在程序的开始部分都必须预先声明,但这一个步骤显然是比较麻烦的,为了简化操作,可以采用各种语言通用的解决办法,就是把所有的声明预先放在一个文件中,在用到的时候再用include语句包含进来。

现在回到Win32 Hello World程序,这个程序用到了两个API函数:MessageBox和ExitProcess,它们分别在User32.dll和Kernel32.dll中。

 

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.