C语言有入口函数,当然Win32编程也有入口函数,虽然它们的写法有所不同,但同为入口函数,基本功能是一样的。不一样的是Win32的入口函数相对来说更为复杂,它为窗口应用程序提供相应的参数。为了让大家更好的了解Win32入口函数的参数,先来了解一下C语言的一些参数,表2.1描述了常用的数据类型。
在表2.1中,需要注意的是“int”类型,在turbo c中,字节数是2,二进制位为16,而在本书中使用的Microsoft Visual C++ 6.0中,字节数是4,二进制位32。如果感兴趣,可以使用“sizeof(int)”语句来验证。
如果之前只做过C或C++程序的开发,那接下来的Win32的数据类型会感觉格格不入,还好在对C/C++语言的基本数据类型进行了回顾,接下来作个简单的对比,这样能更好的理解数据类型,如表2.2所示,描述了C语言与Win32常用的数据类型的对比。
Win32的数据类型众多,有上百个,记忆时可以使用一些技巧,切勿死记硬背,拿“LPCSTR、PCSTR”为例:
“LP”与“P”代表同一含义,即指针;
“C”代表“const”;
“STR”则代表字符串。
合起来的意思是常量字符串指针。
C语言与Win32的数据类型已经做了简单介绍,接下来该谈一谈Win32的入口函数以及参数的作用,其标准函数原型如下:
#include <Windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, "显示的内容", "标题", MB_OK);
return 0;
}
在编写Windows程序时,需要包含头文件“Windows.h”,正如第一行所示。它包含了其他Windows头文件,这些头文件的某些头文件,又包含了其他头文件。在这些头文件中最重要的是:
WINDEF.H 基本型态定义;
WINNT.H 支援Unicode的型态定义;
WINBASE.H Kernel函数;
WINUSER.H 用户界面函数;
WINGDI.H 图形界面函数;
这些头文件涵盖了Win32编程所需要的所有功能及方法,它们是Windows文件中的一个重要组成部分。
入口函数中的“int APIENTRY”,其中“int”为函数的返回值类型,“APIENTRY”为函数标识,它本身是通过宏来进行定义的,如图2.2所示,为“WINDEF.H”头文件中所定义的宏的原型。
“APIENTRY”是由“WINAPI”定义而来,而“WINAPI”则是由“__stdcall”定义。“__stdcall” 是调用约定,保护如何处理参数压入栈的顺序,谁负责清理内存等。在这里只知道写法即可,不用深究其意。
一定要注意的是,Win32的入口函数是“WinMain”而不是“main”,前面的“Win”代表的含义是“Windows”。
“HINSTANCE”,根据MSDN的翻译,为进程的实例句柄,它也为数据类型中的一种,句柄类型。作用是加载进程映像的基本地址,在程序中,唯一标识进程。句柄则是整个Win32编程的基础,一个句柄是指,使用的一个唯一的整数值,是指一个四字节的数值,用于标志应用程序中的不同对象的实例,例如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,可以这样说,句柄就像每位同学的学号一样,唯一标识着一个窗口,需要注意的是,句柄不是一个指针,程序不能利用它来直接阅读文件中的信息。
接下来介绍一下WinMain函数各个参数的含义:
参数HINSTANCE hInstance,进程的实例句柄,在本程序中,唯一标识进程;
参数HINSTANCE hPrevInstance,指向应用程序的前一个进程句柄,在32操作系统该参数为NULL,该参数仅仅被用于16位操作系统,现已经不被使用;
参数LPSTR lpCmdLine,命令行缓冲区,不包括程序的名字,回想一下“char* argv[]”的作用,如果输入“dir /w /p c:Windows”,则lpCmdLine的值为“/w /p c:Windows”;
参数int nCmdShow,窗口的显示状态,该参数可以是下表值之一。