一 实现目的:
在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"
此文章出至我的学生 王玉,感谢她的工作
浙公网安备 33010602011771号