一 实现目的:
在A进程中获得当前运行进程快照,根据B进程的进程名,判断B进程是否生存,当B进程不存在时,创建一个新的B进程
二 主要用到的函数:
1 CreateToolhelp32Snapshot();
2 Process32First(hProcessSnap, &pe32);
3 Process32Next(hProcessSnap, &pe32);
三 步骤:
1 设置定时器,在程序入口函数中添加
SetTimer(1,1000,0);
基于对话框的MFC应用程序是在OnInitDialog()中;
2 利用类向导添加OnTimer()函数
例如:
::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString AppName="D:\\MyProjects\\Hello\\Debug\\Hello.exe";//需要守护的进程名
//如果需要守护的进程名为空
if(AppName.IsEmpty())
{
return;
}
CString strName = AppName;
//如果使用绝对路径,请去掉下面的注释
int npos = strName.ReverseFind('\\');
if(npos <= 0)
{
return ;
}
strName = AppName.Right(AppName.GetLength() - npos - 1);
//定义ProcessEntry32结构
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" 无法得到进程快照 \n");
return ;
}
//需要启动进程的标志位,当进程关闭时,该标志位为TRUE
BOOL bNeedStart = TRUE;
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
//如果该进程名在快照中存在
if(strcmp(pe32.szExeFile, strName) == 0)
{
//启动标志位置FALSE
bNeedStart = FALSE;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
//如果标志位为True,即该进程没有在快照中
if(bNeedStart)
{
//::Sleep(1000);
STARTUPINFO si = { sizeof(si)};
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE;
//启动该进程
BOOL bRet = ::CreateProcess (NULL, AppName.GetBuffer(AppName.GetLength()), NULL,NULL,FALSE, CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
if(bRet)
{
::CloseHandle (pi.hThread);
::CloseHandle (pi.hProcess);
}
}
return ;
CDialog::OnTimer(nIDEvent);
}
四 注意的问题:
添加头文件 #include "tlhelp32.h"
此文章出至我的学生 王玉,感谢她的工作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构