随笔 - 25  文章 - 10 评论 - 11 阅读 - 10万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一  实现目的:
     在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"

此文章出至我的学生 王玉,感谢她的工作

posted on   cinger  阅读(832)  评论(1编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示