2.2  Win32入口函数

2.2 Win32入口函数

  • 最近更新2018年09月17日

特殊说明:版权归个人所有,请勿转载,谢谢合作。

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相同)。

 

分享到 :
相关推荐

发表回复

登录... 后才能评论