WIN32汇编语言教程:第03章 使用MASM · 3.2 调用API(3)
和参数说明中的一样!消息框中出现了一个惊叹号图标,按钮也变成了“是”和“否”两个按钮!MB_ICONWARNING和MB_YESNO等参数究竟是什么意思呢,MASM中显然没有这样的预定义,让我们先来找Visual C++的头文件,在WinUser.h中可以找到下面一段:
/* * MessageBox() Flags */ #define MB_OK Ox00000000L #define MB_OKCANCEL Ox00000001L #define MB_ABORTRETRYIGNORE Ox00000002L #define MB_YESNOCANCEL Ox00000003L #define MB_YESNO Ox00000004L #define MB_RETRYCANCEL Ox00000005L #define MB_ICONHAND Ox00000010L #define MB_ICONQUESTION Ox00000020L #define MB_ICONEXCLAMATION Ox00000030L #define MB_ICONASTERISK Ox00000040L #if(WINVER >= Ox0400) #define MB_USERICON Ox00000080L #define MB_ICONWARNING MB_ICONEXCLAMATION #define MB_ICONERROR MB_ICONHAND #endif /* WINVER >= 0x0400 */ #define MB_ICONINFORMATION MB_ICONASTERISK #define MB_ICONSTOP MB_ICONHAND ......
显然,MB_YESNO就是4,MB_ICONWARNING就是30h,默认的MB_OK就是0,Win32 API的参数使用这样的定义方法显然是为了免除程序员死记数值定义的麻烦。在编写Win32汇编程序的时候,MASM32工具包中的Windows.inc也包括了所有这些参数的定义,只要在程序的开头包含这个定义文件:
include windows.inc
就可以方便地完全按照API手册来使用Win32函数。
打开\masm32\include目录下的Windows.inc查看一下,可以发现整个文件总共有两万六千多行,包括了几乎所有的Win32 API参数中的常量和数据结构定义。正是有了这个文件中详尽的定义,Win32ASM才得以流行起来,试想一下,哪个程序员愿意每使用一个API语句,就到函数手册中去看参数,然后到Microsoft发布的Visual C++的头文件中去找对应的数值,再应用到汇编源程序中?这样会有80%以上的时间花在做无用功上(最后还是要骂Microsoft为什么不提供汇编格式的头文件,毕竟MASM32工具包不是Microsoft出的)。
有时候由于版本的原因,当使用最新的API手册时,会发现有些参数使用的常量在Windows.inc中并没有定义,这下惨了,谁都不知道类似于MB_XXXYYY的东西代表什么数值,Microsoft的《Microsoft Programmer's Reference》手册中从来就不会把参数对应的数值写进去。遇到这种情况,只有拿出最原始的办法了,就是到最新的Visual C++或SDK的include目录中去,在C语言格式的 .h头文件中把定义找出来,然后自行增补到Windows.inc中去。如果这样也找不到定义值的话,那只好放弃使用这个API了。
上页:第03章 使用MASM · 3.2 调用API(2) 下页:第03章 使用MASM · 3.3 标号、变量和数据结构(1)