特殊说明:版权归个人所有,请勿转载,谢谢合作。
C语言有入口函数,当然Win32编程也有入口函数,虽然它们的写法有所不同,但同为入口函数,基本功能是一样的。不一样的是Win32的入口函数相对来说更为复杂,它为窗口应用程序提供相应的参数。为了让大家更好的了解Win32入口函数的参数,先来了解一下C语言的一些参数,表2.1描述了常用的数据类型。
- 表2.1 C/C++语言基本数据类型
类型 | 说明 | 字节数 | 二进制位 | 值域 |
char | 字符型 | 1 | 8 | -128~127 |
signed char | 有符号字符类型 | 1 | 8 | -128~127 |
unsigned char | 无符号字符类型 | 1 | 8 | 0~255 |
int | 整型 | 2 | 16 | -32768~32767 |
signed int | 有符号整型 | 2 | 16 | -32768~32767 |
unsigned int | 无符号整型 | 2 | 16 | 0~65535 |
short int | 短整型 | 2 | 16 | -32768~32767 |
signed short int | 有符号短整型 | 2 | 16 | -32768~32767 |
unsigned short int | 无符号短整型 | 2 | 16 | 0~65535 |
long | 长整型 | 4 | 32 | -231~(231-1) |
signed long | 有符号长整型 | 4 | 32 | -231~(231-1) |
unsigned long | 无符号长整型 | 4 | 32 | 0~(232-1) |
float | 浮点型 | 4 | 32 | 7位有效位数 |
double | 双精度型 | 8 | 64 | 15位有效位数 |
char * | 字符指针 | 4 | 32 | – |
const char * | 字符指针常量 | 4 | 32 | – |
在表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常用的数据类型的对比。
- 表2.2 C/Win32常用数据类型对比
C数据类型 | Win32数据类型 |
char * | LPSTR, PSTR |
const char * | LPCSTR, PCSTR |
void | VOID |
void * | LPVOID |
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”头文件中所定义的宏的原型。
- 图2.1 APIENTRY定义
“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,窗口的显示状态,该参数可以是下表值之一。
- 表2.3 窗口显示状态
标识 | 描述 |
SW_HIDE | 隐藏窗口并且激活另外一个窗口。 |
SW_MINIMIZE | 最小化指定的窗口,并且激活在系统表中的顶层窗口。 |
SW_RESTORE | 激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。 |
SW_SHOW | 激活一个窗口并以原来的尺寸和位置显示窗口。 |
SW_SHOWMAXIMIZED | 激活窗口并且将其最大化。 |
SW_SHOWMINIMIZED | 激活窗口并将其最小化(以图标显示)。 |
SW_SHOWMINNOACTIVE | 将一个窗口显示为图标。激活窗口维持活动状态。 |
SW_SHOWNA | 以窗口的当前状态显示窗口。激活窗口保持活动状态。 |
SW_SHOWNOACTIVATE | 以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。 |
SW_SHOWNORMAL | 激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。 |