📄 见招拆招《windows程序设计》(一) .txt
字号:
int nShowCmd
);
您会注意到我在HELLOMSG.C中做了许多小改动。第三个参数在WINBASE.H中定义为LPSTR,我将它改为PSTR。这两种数据型态都定义在WINNT.H中,作为指向字符串的指针。LP前缀代表「长指针」,这是16位Windows下的产物。
我还在WinMain声明中改变了两个参数的名称。许多Windows程序中的变量名使用一种称作「匈牙利表示法」的命名系统,该系统在变量名称前面增加了表示变量数据型态的短前缀,我将在第三章更详细地讨论这个概念。现在仅需记住前缀i表示int、sz表示「以零结束的字符串」。
WinMain函数声明为返回一个int值。WINAPI标识符在WINDEF.H定义,语句如下:
#define WINAPI __stdcall
该语句指定了一个呼叫约定,包括如何生产机器码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。
WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中。我们将在 第三章中介绍使用该参数的方法。
MessageBox函数
MessageBox函数用于显示短信息。虽然,MessageBox显示的小窗口不具有什么功能,实际上它被认为是一个对话框。MessageBox的第一个参数通常是窗口句柄,我们将在第三章介绍其含义。第二个参数是在消息框主体中显示的字符串,第三个参数是出现在消息框标题列上的字符串。在HELLMSG.C中,这些文字字符串的每一个都被封装在一个TEXT宏中。通常您不必将所有字符串都封装在TEXT宏中,但如果想将您的程序转换为Unicode字符集,这确是一个好主意。我将在第二章详细讨论该问题。MessageBox的第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合。您可从第一组中选择一个常数指出希望在对话框中显示的按钮:
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
如果在HELLOMSG中将第四个参数设置为0,则仅显示「OK」按钮。可以使用C语言的OR(|)操作符号将上面显示的一个常数与代表内定按钮的常数组合:
#define MB_DEFBUTTON1 0x00000000L
#define MB_DEFBUTTON2 0x00000100L
#define MB_DEFBUTTON3 0x00000200L
#define MB_DEFBUTTON4 0x00000300L
还可以使用一个常数指出消息框中图示的外观:
#define MB_ICONHAND 0x00000010L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
这些图示中的某些有替代名称:
#define MB_ICONWARNING MB_ICONEXCLAMATION
#define MB_ICONERROR MB_ICONHAND
#define MB_ICONINFORMATION MB_ICONASTERISK
#define MB_ICONSTOP MB_ICONHAND
虽然只有少数其它MB_常数,但您可以自己参考表头文件。
在本程序中,MessageBox返回数值1,但更严格地说它返回IDOK,IDOK在WINUSER.H中定义,等于1。根据在消息框中显示的其它按钮,MessageBox函数还可返回IDYES、IDNO、IDCANCEL、IDABORT、 IDRETRY或IDIGNORE。
这个小的Windows程序真的与K&R的「hello, world」程序有着同等效果吗?您也许认为不是,因为MessageBox函数并没有「hello, world」中printf函数所具有的潜在格式化文字能力。但我们将在下一章中看到编写类似printf的MessageBox版本的方法。
编译、连结和执行
为了更接近问题的本质,我只采用DOS控制台下的编译方法。编写 make.bat 如下:
set path=G:\VC98\bin
cl /c /IG:\VC98\include hellomsg.c
link /SUBSYSTEM:windows /machine:IX86 /LibPath:G:\VC98\lib G:\VC98\hellomsg.obj user32.lib kernel32.lib (注意:是在一行)
将这个make.bat和 hellomsg.c 都放在 vc98目录下,运行make.bat:
即完成编译,生成hellomsg.exe。
运行之:
下面介绍如何使用 Win32 汇编语言实现同样的功能。
选择新建一个汇编程序,将下面的代码拷贝上去,运行即可。
;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
.DATA
.DATA?
.CODE
START:
invoke MessageBox,NULL,CTXT('Hello,Windows!'),CTXT('HelloMsg'),0
invoke ExitProcess,0
END START
小结:本节主要是为了建立一些基本概念,如何编写程序只是很小的一部分。如果说,前面的教程是随心所欲的“游击战”,这篇则是正规的“阵地战”。
Zoologist 2007-8-17
--------------------------------------------------------------------------------
<<<上一篇 欢迎访问AoGo汇编小站:http://www.aogosoft.com <a href="downpage.asp?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -