win2000 不是合法的win32应用程序_windows程序设计基础(第二章)——2.2 Win32入口函数...

c7b9daab0fd8cec6a1e5ab9025b8e31f.png

C语言有入口函数,当然Win32编程也有入口函数,虽然它们的写法有所不同,但同为入口函数,基本功能是一样的。不一样的是Win32的入口函数相对来说更为复杂,它为窗口应用程序提供相应的参数。为了让大家更好的了解Win32入口函数的参数,先来了解一下C语言的一些参数,表2.1描述了常用的数据类型。

c0b5e5cd9478de750501b3460a98d8be.png
表2.1 c/C++ 语言基本数据类型

在表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常用的数据类型的对比。

6be8b9a0e77d7fa858378123fbeb0e59.png
表2.2C/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编程的基础,一个句柄是指,使用的一个唯一的整数值,是指一个四字节的数值,用于标志应用程序中的不同对象的实例,例如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,可以这样说,句柄就像每位同学的学号一样,唯一标识着一个窗口,需要注意的是,句柄不是一个指针,程序不能利用它来直接阅读文件中的信息。

6e5e6118a64ea810f7007f693108e5f5.png
图2.3APIENTRY定义

接下来介绍一下WinMain函数各个参数的含义:

参数HINSTANCE hInstance,进程的实例句柄,在本程序中,唯一标识进程;

参数HINSTANCE hPrevInstance,指向应用程序的前一个进程句柄,在32操作系统该参数为NULL,该参数仅仅被用于16位操作系统,现已经不被使用;

参数LPSTR lpCmdLine,命令行缓冲区,不包括程序的名字,回想一下“char* argv[]”的作用,如果输入“dir /w /p c:Windows”,则lpCmdLine的值为“/w /p c:Windows”;

参数int nCmdShow,窗口的显示状态,该参数可以是下表值之一。

dc72ebe1d7698162e6e2855ac85957a9.png
表2.3窗口显示状态

70161bdb92ed08dac552cfd4393ead1b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值