Windows零基础入门:2.5 实例句柄深入和命令行参数使用

3134 人浏览 | 时间: 2015-08-11 16:23:37 | 作者: codexia

    在上节课里,分别介绍了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版本。
    直接运行程序,弹出的消息内容为空。测试命令行程序方法,请参见《应用程序如何传递参数(命令行)以及如何测试命令行》。
    本节对于实例句柄,可能有点绕,多看几遍。命令行参数就是一个字符串,想怎么解析就看人家如何定义参数了。你会处理字符串,这就没有问题了。
请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

Win32课程菜单