您的位置:首页 > 其它

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

2006-05-29 14:33 323 查看
1、准备工作
1.Proccss的概念
用最简短的话来说,进程就是当前运行的应用程序。运行的应用程序包括exe,dll这两种文件。文件和进程的差别在于文件是保存在磁盘上的,是静止的,计算机不会去调用文件,而进程是非静止的,正是由于着个原因,所以计算机每调用一个进程就需要一定的资源。这些资源包括内存,虚拟页面,句柄,gdi……
系统进程在系统上由其进程标识符唯一标识。与许多 Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过 Process 组件的 Handle 属性访问。因此,可以获取进程的管理信息,如 ExitCode(通常,或者为零表示成功,或者为非零错误代码)和 ExitTime。句柄是非常有价值的资源。
2. thread的概念
进程由一个或多个线程组成。换句话说线程是将进程分成了多个小的部分.每个线程都有优先级,在较高优先级的线程完成任务的时候,较低优先级的线程可能会被迫等待。在多处理器计算机上,将多个线程移到不同的处理器上,从而对 CPU 负荷进行平衡。每个进程启动时都具有一个线程,该线程称为主线程。任何线程都可创建其他线程。进程中的所有线程共享该进程的地址空间。
3. module的概念
模块指的是可执行文件或动态链接库 (DLL)。每个进程包含一个或多个模块。

具体说,内存中的file从可以从硬盘上来,如果这个file是可执行文件,它将生成module,module运行起来就是process,process可以包含多条thread,而thread的运行映象最终还是来自于file。thread是kernel obj中最重要的一个,因为消息队列就是thread拥有的,只有thread才能够接受message。对gdi obj、urser obj和file的操作,也是发生在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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐