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

原创 2006年05月29日 14:33:00

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);
    }
   }
  }  
 }

Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。

Microsoft Office Excel 不能访问文件“D:\WWWRoot\KOBELCOSH\WebUI\ExcelTemplate\QUOTE5.xls”。 可能的原因有: 1 文件名称或...
  • smeyou
  • smeyou
  • 2012年07月17日 10:50
  • 22371

发布网站时根据文件路径和文件名规范Inherits和Class名称,合并唯一程序集

发布网站时根据文件路径和文件名规范Inherits和Class名称,合并唯一程序集 在Visual Studio 2003下开发网站的都知道ASP.NET 1.1网站生成后都是一个唯一命名的程序集(...

VB6: 通过窗口句柄得到窗口所在程序的名称和路径(实例)

Option Explicit Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassN...

修改Android工程的名称、安装路径、应用程序进程名

在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总结: 1.      修改工程名(apk名称) 在弹出的对话框中输入新名称 该操作实际上是修改/.project下的...
  • hcj116
  • hcj116
  • 2014年03月21日 13:50
  • 14917

Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。

Microsoft Office Excel 不能访问文件“D:\WWWRoot\KOBELCOSH\WebUI\ExcelTemplate\QUOTE5.xls”。 可能的原因有: 1 文件名称或...

VS C# 命名空间 “ ”中不存在类型或命名空间名称 “ ” 。是否缺少程序集引用?

命名空间 “ Charge”中不存在类型或命名空间名称 “ DAL” 。是否缺少程序集引用? 这是昨天遇到的问题,解决之后觉得有必要分享出来; 之所以这样报错...

BlackBerry手机上Java程序如何判断当前手机使用的运营商网络名称?网路制式?

你可以使用RadioInfo API了解相关信息,拿到的信息如下:   Network Name Network 9650 + China Telecom 乱码((手...

解决:无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次

1、输入的中划线“-”格式不对,检查是否为全角状态下输入,误输入了下划线“_",或是前后有空格; 2、没有引用EntityFramework命令,请执行如下名称(Import-Module 项目路径...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据程序名称和程序路径判断程序是否启动
举报原因:
原因补充:

(最多只允许输入30个字)