博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
根据程序名称和程序路径判断程序是否启动
阅读量:4071 次
发布时间:2019-05-25

本文共 3447 字,大约阅读时间需要 11 分钟。

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

转载地址:http://mkwni.baihongyu.com/

你可能感兴趣的文章
关于XMLList = node["节点1"]["节点2"]中只有1个节点的问题
查看>>
readUnsignedInt () 自动移动字节流位置,和.net是一样的
查看>>
大型应用程序中的资源destory办法
查看>>
action,webaction,mode,controller
查看>>
多个单例模式单例模式的应用
查看>>
北山白云里,隐者自怡悦。
查看>>
mouseChildren= false
查看>>
12个Flex常用功能代码
查看>>
addChild一个.swf时,该swf的背景色失效,同时如有超出大小的范围,也会显示,造成边距...
查看>>
MovieClip,Sprite,Shape三者之间的区别
查看>>
欣赏ActionScript 3 的元件架构
查看>>
在as3中只有事件(或该事件的子级)的发送者才能侦听事件
查看>>
rotation的单位是角度
查看>>
所谓速度就是每次移动比上次移动的距离多一点
查看>>
Flex Develpment中右边的框的linkWithEdit
查看>>
不兼容的签名实现和函数默认参数
查看>>
不兼容的签名实现,
查看>>
字体轮廓和设备字体
查看>>
水平和垂直翻转可视对象
查看>>
1.随机函数,计算机运行的基石
查看>>