一  实现目的:
     在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 2009-07-20 10:03  cinger  阅读(847)  评论(1)    收藏  举报