您的位置:首页 > 编程语言 > C语言/C++

《Windows via C/C++》学习笔记 —— 进程

2008-07-29 17:56 232 查看
从第四章开始就进入了“进程”。
关于进程,先给出如下一个定义:“进程”是一个正在运行的程序的“实例”,是“线程”的一个“容器”。它包含两个部分:操作系统用来管理该进程的一个内核对象和一个包含有可执行模块或DLL模块的代码和数据以及动态内存分配的空间的“地址空间”。
进程只是一个容器,所以进程是“不活跃”的,我们把它仅作为一个容器来学习,那么作为一个容器,我们就应该考虑我们怎么来创建这个容器,管理这个容器和销毁这个容器。
在进程中有一个或多个线程,当一个进程创建时,该进程的主线程也被创建,也就是说,一个进程至少包括一个主线程。
当一个进程中有多个线程在执行的时候,Windows操作系统采用时间片的方法将这些线程分配给CPU进行调度,也就是每个线程轮流地获得一定的CPU调度时间,从而执行相关操作。

当一个C/C++编写的程序运行时,都需要一个入口函数。默认地,有4个函数可供选择——WinMain、wWinMain、main、wmain。前两个可以被_tWinMain替代,是GUI(图形用户界面)的主函数;后两个可以被_tmain替代,是CUI(控制台用户界面)的主函数。其中,带前缀w表示是UNICODE版本,不带w的表示是普通ANSI版本。链接器查看链接开关,决定是调用GUI还是CUI的主函数。

当一个程序执行后,我们可以通过“GetStartupInfo函数”获取该进程的启动信息,它的参数是一个“指向STARTUPINFO结构的指针”,要使用这个函数,必须先设置STARTUPINFO的cb字段的大小为sizeof(STARTUPINFO),然后方可将它的地址传递给GetStartupInfo函数,获取进程启动信息。
每个可执行程序或DLL文件被加载进内存中,都分配一个唯一的“实例句柄”标识它们。这个实例句柄就是传递给(w)WinMain主函数的HINSTANCE hInstance参数,这个实例句柄就是可执行程序的“基地址”。一些API函数也需要一个HMOUDLE的模块句柄作为参数运行。在32位和32位以上的系统中,HINSTANCE和HMOUDLE是完全相同的两个类型,没有什么差别,你可以使用“GetModuleHandle函数”获得一个程序的实例句柄(模块句柄)。

创建进程,微软为我们提供了一个GreateProcess()函数,该函数返回一个进程内核对象句柄,通过这个句柄可以方便的管理进程这个容器。但是就像木桶这个一个容器,有大有小,而且形状也各异,自然创建一个具体的进程也要涉及这些性质,所以在创建时,微软为我们提供了各种参数。对于各种属性我们可以通过Get*函数取得通过Set*设置。

终止进程,书上给了四种方法:
1、主线程进入点函数自动返回;
2、在本进程中呼叫ExitProcess(UINT )函数,传递一个返回代码给它,以此结束本进程;
3、在本进程或其他进程中呼叫TerminateProcess(HANDLE, UINT)函数,传递一个进程句柄和一个返回代码给它,以结束该句柄标识的进程,这个被结束的进程的返回代码就是传递给该函数的返回代码;
4、进程中所有线程自动终止,这种情况很少会出现。
建议采用第1种方法:主线程的进入点函数返回。

第四章讲的东西很基础,后面提到了还UAC机制(用户访问控制,这个是Windows Vista需要考虑的),因为无法彻底理解,所以以后再总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: