在我的程序A.exe中,需要启动B.exe,但希望能够在启动B.exe之前,检查B.exe是否已启动。
请大家能够给出尽量简单的方法,最好是通过现有的win32 api实现,
当然,如果没有这样的api,多条语句实现也可接受。
我使用VC6的开发环境。
请大家能够给出尽量简单的方法,最好是通过现有的win32 api实现,
当然,如果没有这样的api,多条语句实现也可接受。
我使用VC6的开发环境。
调试欢乐多
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
// 做一个系统中当前进程列表的快照 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
// 初始化PROCESSENTRY32结构 pe32.dwSize = sizeof(PROCESSENTRY32);
// 遍历进程列表,结构体pe32保存了进程的ID,进程名,优先级等信息,你可以利用这个结构来判断是不是你想要操作的进程。
// if (Process32First(hProcessSnap, &pe32))
{
do
{
//在这里你可以对当前枚举到的进程进行处理,如果是你需要结果的进程,就
//HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
//if(!hProcess)
//TerminateProcess(hProcess);
//来结束进程。
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of processes
// Do not forget to clean up the snapshot object. CloseHandle (hProcessSnap);
return (bRet);
}
或者
CreateToolhelp32Snapshot
Process32First
Process32Next -----------------------
如果不想遍历,也可以执行如下命令行,判断进程是否在运行(XP及以上, win2k 貌似没有tasklist命令)
tasklist /FI "imagename eq B.exe" /NH
http://msdn.microsoft.com/en-us/library/ms682621(VS.85).aspxlz 你说的只是这里面的小部分功能。
if(GetLastError() == ERROR_ALREADY_EXISTX)
{
return FALSE
}
现在我无法获得B.exe的源代码。
都没有的话只好枚举进程了。
Process32First
Process32Next
来处理了。
如果也是你自己开发的程序的话。只允许一个应用程序实例
http://blog.csdn.net/DavidHsing/archive/2009/04/30/4138378.aspx
/* 互斥 */
/************************************************************************/
HANDLE m_hMutex;
m_hMutex = ::CreateMutex(NULL, TRUE, "互斥名");
if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
{
HWND oldHWnd = NULL;
oldHWnd = ::FindWindow(NULL, _T("B名字")); //查找已经运行的程序
if (oldHWnd)
{
::ShowWindow(oldHWnd, SW_SHOWNORMAL); //激活显示找到的已运行的程序
::SetForegroundWindow(oldHWnd); //将已运行的程序设置为当前窗口
}
else
{
//未运行,运行B
}
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
/************************************************************************/
/* 互斥 */
/************************************************************************/
HANDLE m_hMutex;
m_hMutex = ::CreateMutex(NULL, TRUE, "互斥名");
if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
{
HWND oldHWnd = NULL;
oldHWnd = ::FindWindow(NULL, _T("B名字")); //查找已经运行的程序
if (oldHWnd)
{
::ShowWindow(oldHWnd, SW_SHOWNORMAL); //激活显示找到的已运行的程序
::SetForegroundWindow(oldHWnd); //将已运行的程序设置为当前窗口
}
else
{
//未运行,运行B
}
CloseHandle(m_hMutex);
m_hMutex = NULL;
}去掉最后的 return FALSE;
DWORD dCurrentId = GetCurrentProcessId();
PROCESSENTRY32* info=new PROCESSENTRY32;
info->dwSize=sizeof(PROCESSENTRY32);
if(Process32First(m_hfindhandle,info))
{
while(Process32Next(m_hfindhandle,info)!=FALSE)
{
if (info->szExeFile == "abc.EXE")
{
if (dCurrentId != info->th32ProcessID)
{
HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID);
if(h!=NULL)
{
Sleep(100);
TerminateProcess(h,0);
}
}
}
}
CloseHandle(m_hfindhandle);//关闭进程否则会出错
if (info)
{
delete info;
}
}