更新时间:2015-08-11 16:23:37浏览次数:1+次
在上节课里,分别介绍了WinMain函数的几个参数的作用,这节课我们来使用学过的知识来使用这些参数。下面来用图解方式,再说说第一个参数,加深理解。
我们的exe程序或者dll文件,运行的时候,不是直接复制到内存中的,而是映射到内存中的。什么意思呢?就是说,你exe所在的硬盘空间,直接作为内存和硬盘的交换空间,所以加载程序,就直接从硬盘读取。这个和C盘的交换空间是一个意思。程序运行时内存需要将暂时不用的数据换出存放在硬盘里,需要的时候再读取到内存,这就是交换的意思。这样可以大大加快加载程序的速度,省掉了复制文件的过程。而且,现在各种游戏软件不是一般的大,也不可能直接加载到内存的。那么系统就要给程序文件所在的硬盘空间做一个标记,表示这一块地盘就是我系统运行你这个程序需要用的。直到这个程序运行结束,就不需要了。这个过程就是映射。也就表示,程序文件不动,程序加载到内存,在内存是有一块内存空间的,那么这个内存空间就和这个硬盘中的程序文件的硬盘空间进行对应,以后内存需要什么文件,就到硬盘这里去找,然后加载到内存中,如果内存中某个文件暂时不用,就将他放回到硬盘。
那么在程序运行时,你要获取程序内部的资源,也就是放在exe文件内部的资源,比如图片等,你需要在内存的exe数据中去读取这个资源。那么你如何去找到你的程序在内存的开始的位置呢?这个时候就是应用程序实例句柄出场的时候。实例句柄就是程序映射到内存时程序在内存的起始地址,那么通过这个起始地址就可以去计算资源放在哪里,然后使用资源。
这个起始地址上包含了PE头信息和PE文件映射后的具体内容,微软将之作为句柄来原因在于PE头过于复杂,使用者直接对PE结构进行访问不安全,这种编程手法在C语言编程中很常见。为什么说每一个实例句柄都是唯一的,因为它映射到内存中要放在一个内存的地方的,多个实例有多个地方存放,每一个实例存放的起始位置都不一样,因为多个实例不能重叠放在一起。这也让你明白,为什么程序实例句柄是唯一的。
对于实例句柄的使用,后面课程就要介绍。所以先不说。暂时理解到这个地步,就可以了。先把命令行参数的使用讲一下。这个在后面,不会再讲了。而最后一个参数与窗口显示有关,后面再介绍。
命令行就是程序执行前有外部传入的一些参数,供程序初始化等使用。比如程序的参数调用。如果命令行的参数错误,程序就可以不启动。
我们就简单的直接显示命令的消息。至于具体如何处理,你去解析一下命令行参数就行了,命令行就是一串字符而已。
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,PSTR szCmdLine,int iCmdShow)
{
MessageBoxA(NULL, szCmdLine,"Tip",0);
}
我们这里直接以消息框显示了命令行传入的参数。因为命令行是char*窄字符类型,所以就使用了MessageBoxA版本。