启动和结束进程
今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉。实现这一功能有替代方案,即使用.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);
下面是这个示例的运行结果图,完整的代码我稍后上传到资源区中。
另外,再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。
- HINSTANCE ShellExecute(
- _In_opt_ HWND hwnd,
- _In_opt_ LPCTSTR lpOperation,
- _In_ LPCTSTR lpFile,
- _In_opt_ LPCTSTR lpParameters,
- _In_opt_ LPCTSTR lpDirectory,
- _In_ INT nShowCmd
- );
我们这里只是运行一个程序,没有其他操作,所以,带 _In_opt_的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。
于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。
- ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);
看看结果,和前面效果差不多。
源代码稍后上传。
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人