本帖最后由 小白兔° 于 2013-8-3 09:54 编辑
这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的 缘故吧。我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是 给大家了解一下,Win32是个啥东西而已。另外,在专访中,有些人也误认为我说C++非学不可 ,那也不是,我也提到过了,C++的学习可以使你懂得更多知识,为你以为学习各种技术打下基础。今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉。实现这 一功能有替代方案,即使用.NET库中的System::Diagnostics::Process类来完成。在Win32中,启动一 个进程可以理解为创建进程,所以可以调用CreateProcess函数,结束进程则调用TerminateProcess函 数。唯一标识一个进程的是PID,而我们要对进程进行各项操作,进程也存在于内存中,也可以 视为一种资源,我们知识,操作图标资源有HICON,操作位图资源有HBITMAP,同样道理,对进程所作的 操作也要通过一个标识符(句柄)——HANDLE。CreateProcess函数的最后一个参数是一个指向 PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。 - typedef struct _PROCESS_INFORMATION {
- HANDLE hProcess; //进程的句柄
- HANDLE hThread; //主线程的句柄
- DWORD dwProcessId; //进程ID
- DWORD dwThreadId; //主线程ID
- } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
复制代码 接下来我们要 对已创建进程进行的一系列操作,都以hProcess为纽带,包括获取退出码和终止进程。CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和 PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一 段内存中的数据初始化为0.示例代码如下:- PROCESS_INFORMATION pro_info; //进程
- 信息
- STARTUPINFO sti; //启动信息
- //......
- // 初始化两个结构体
- ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
- ZeroMemory(&sti, sizeof(STARTUPINFO));
复制代码 接着调用CreateProcess创建进程.- CreateProcess(L"C:\\Windows\\System32
- \\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);
复制代码 调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。要结 束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码, 通过GetExitCodeProcess函数可以获取。- DWORD exitCode; //退出码
- //.........
- GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码
- TerminateProcess(pro_info.hProcess, exitCode);
- // 关闭句柄
- CloseHandle(pro_info.hThread);
- CloseHandle(pro_info.hProcess);
复制代码 |