根据程序名称和程序路径判断程序是否启动

1、准备工作

1Proccss的概念

用最简短的话来说,进程就是当前运行的应用程序。运行的应用程序包括exe,dll这两种文件。文件和进程的差别在于文件是保存在磁盘上的,是静止的,计算机不会去调用文件,而进程是非静止的,正是由于着个原因,所以计算机每调用一个进程就需要一定的资源。这些资源包括内存,虚拟页面,句柄,gdi……

系统进程在系统上由其进程标识符唯一标识。与许多 Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过 Process 组件的 Handle 属性访问。因此,可以获取进程的管理信息,如 ExitCode(通常,或者为零表示成功,或者为非零错误代码)和 ExitTime。句柄是非常有价值的资源。

2. thread的概念

进程由一个或多个线程组成。换句话说线程是将进程分成了多个小的部分.每个线程都有优先级,在较高优先级的线程完成任务的时候,较低优先级的线程可能会被迫等待。在多处理器计算机上,将多个线程移到不同的处理器上,从而对 CPU 负荷进行平衡。每个进程启动时都具有一个线程,该线程称为主线程。任何线程都可创建其他线程。进程中的所有线程共享该进程的地址空间。

3. module的概念

模块指的是可执行文件或动态链接库 (DLL)。每个进程包含一个或多个模块。

 

具体说,内存中的file从可以从硬盘上来,如果这个file是可执行文件,它将生成modulemodule运行起来就是processprocess可以包含多条thread,而thread的运行映象最终还是来自于filethreadkernel obj中最重要的一个,因为消息队列就是thread拥有的,只有thread才能够接受message。对gdi objurser objfile的操作,也是发生在thread中的。所以书都讲,process至少拥有一个thread

 

2、实现说明

需要使用到的头文件:tlhelp32.h -  WIN32 tool help functions, types, and definitions

需要使用到的lib文件:kernel32.lib

需要使用到的结构说明:

typedef struct tagPROCESSENTRY32

{

    DWORD   dwSize;                           //结构大小

    DWORD   cntUsage;                        //进程的引用数

    DWORD   th32ProcessID;                //进程ID

    DWORD   th32DefaultHeapID;          //进程默认堆ID

    DWORD   th32ModuleID;                //进程模块ID

    DWORD   cntThreads;                            //此进程开启的线程计数

    DWORD   th32ParentProcessID;              //父进程ID

    LONG    pcPriClassBase;         //线程优先级

    DWORD   dwFlags;                         //保留

    CHAR    szExeFile[MAX_PATH];      //进程全名

} PROCESSENTRY32;

3、源代码

 //测试循环获得系统进程是否已经启动
 HANDLE m_hProcessSnap = NULL;
 HANDLE m_hModuleSnap = NULL;
 HANDLE m_hThreadSnap = NULL;
 PROCESSENTRY32 m_pe32;
 MODULEENTRY32 m_me32;
 THREADENTRY32 m_te32;
 
 memset(&m_pe32,0,sizeof(m_pe32));
 m_pe32.dwSize = sizeof(PROCESSENTRY32);
 memset(&m_me32,0,sizeof(m_me32));
 m_me32.dwSize = sizeof(MODULEENTRY32);
 memset(&m_te32,0,sizeof(m_te32));
 m_te32.dwSize = sizeof(THREADENTRY32);

 //获取需要检测的进程列表
 CString strTemp;
 CString astrName[254];
 CString astrPath[254];
 int  anIsRunning[254];
 int i, nProcessCount;   //总进程数
 nProcessCount = m_ctrlGatewayService.GetItemCount();
 for (i=0; i<nProcessCount; i++)
 {
  astrName[i] = m_ctrlGatewayService.GetItemText(i, 0);
  astrPath[i] = m_ctrlGatewayService.GetItemText(i, 2);
  anIsRunning[i] = -1;  //假设他还没有运行
 }
   
 //获取进程快照
 m_hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 CString strExeName, strExePath;  //运行文件名,运行路径
 if (::Process32First(m_hProcessSnap,&m_pe32))
 {
  do
  {
   //
   strExeName.Format("%s",m_pe32.szExeFile);
   for (i = 0; i< nProcessCount; i++)
   {
    if (strExeName == astrName[i])
    {
     m_hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,m_pe32.th32ProcessID);
     
     ::Module32First(m_hModuleSnap, &m_me32);
     do {
      strExePath.Format("%s",m_me32.szExePath);
      if (strExePath == astrPath[i])
      {
       m_ctrlGatewayService.SetItemText(i, 1, "运行");
       anIsRunning[i] = 1;  //设置标志为已经运行
       //判断线程是否启动
       m_hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,m_pe32.th32ProcessID);
       ::Thread32First(m_hThreadSnap, &m_te32);
       do {
        
       } while(::Thread32Next(m_hThreadSnap, &m_te32));
      }
      
     } while(::Module32Next(m_hModuleSnap, &m_me32));
    }
   }
  }while (::Process32Next(m_hProcessSnap,&m_pe32));
 }

 HINSTANCE hShellReturn;
 //强制启动没有启动并且允许强制启动的进程
 for (i = 0; i<nProcessCount; i++)
 {
  if (anIsRunning[i] == -1)
  {
   m_ctrlGatewayService.SetItemText(i, 1, "停止");
   if (m_ctrlGatewayService.GetItemText(i,4)=="是")
   {
    hShellReturn = ShellExecute(NULL,"open",astrPath[i],"","", SW_SHOW );
    if (long(hShellReturn) > 32)
    {
     m_ctrlGatewayService.SetItemText(i, 1, "运行");
     ::SendMessageA(::FindWindowA(NULL,"CMC_Gateway"), WM_USER + 101, 0, 0);
    }
    else
    {
     strTemp.Format("运行以下进程失败!请确认程序是否可以运行/r/n进程名:%s/r/n进程路径:%s");
     AfxMessageBox(strTemp);
    }
   }
  }  
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值