高手进!!C++保证createprocess创建的进程只有一个运行在当前系统进程
我的主进程通过createprocess(“.\\haha.exe -a”....)创建进程haha.exe。
现在要保证当前系统进程中只有一个haha.exe存在
补充:当主进程再次执行时,将先判断系统进程是否存在haha.exe进程。不存在才用createprocess函数再次创建。
网上大侠告诉我的方法有以下:(我有疑问)
第一个:
HANDLE hSingle = CreateMutex(NULL, NULL, “haha.exe”)
if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())
//已经存在
...
else
{
//不存在,创建子进程
CreateProcess(“.\\haha.exe -a”....);
}
这个我遇到的问题是:不管怎么执行,总是创建子进程,当前系统进程中存在着haha.exe,
这个if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())就和没用一样。求解答。我哪里用错了。
第二个:
bool MyWatch(char * thread_name)
{
PROCESSENTRY32 pe32;
char * mychar;
BOOL bstart=TRUE;
HANDLE hProcessSnap;
while(1)
{
pe32.dwSize=sizeof(pe32);
hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot调用失败!\n");
return -1;
}
//遍历进程快照。轮流显示每个进程的信息
bstart = TRUE;
BOOL bMore=::Process32First(hProcessSnap,&pe32);
USES_CONVERSION; //启用宏命令标记
mychar = W2A(pe32.szExeFile);
if(0==strcmp(thread_name,mychar)) //比较你的进程名字是否相同,判断是否进程在启动
{
printf("你的程序在运行!");
bstart = FALSE;
break;
}
// printf("进程名称:%s\n",W2A(pe32.szExeFile));
// printf("进程ID号:%u\n\n",pe32.th32ProcessID);
bMore=::Process32Next(hProcessSnap,&pe32);
}
//清除snapshot对象
::CloseHandle(hProcessSnap);
return bstart;
}
以下简单一写我的主进程
int main()
{
if(MyWatch(“haha.exe”))
{
createprocess(".\\haha.exe");
}
return 0;
}
这个方法我的疑问:不管怎么执行,这个上面main里面的判断总是true,总是执行createprocess函数。系统进程里有haha.exe也再次执行。请问我哪里理解的不对。高手快来帮我解答下吧。万分感谢。
谁还有好的方法也可以告诉我。重点是我通过createprocess函数创建的是带参数的可执行文件。
有懂得指点下俺。坐等求指教。。。。。。
[解决办法]
不要判断进程名称,可能有多个相同名称的进程
而要判断进程id,一个系统下进程id是唯一的
[解决办法]
if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())
如果系统存在同名的互斥量,会返回之前同名的互斥量对象句柄,并不是返回NULL.
[解决办法]
1、是在你父进程中做,也就是说只有父进程才能确保只存在一个进程。
另外确实,把hSingle == NULL 去掉
如果GetLastError返回0,说明没有错误
2、应该是和你用的项目字符集有关系,或者进程名称不同
私信我,qq告诉我,帮你调试一下吧
[解决办法]
当初我是监视程序,因此需要while(1)
现在你只要遍历1次就可以判断是否需要重新CreateProcess了。
把While(1)去掉吧
[解决办法]
1
HANDLE hMutex = CreateMutex(NULL, TRUE, _T("MutexName")); if(GetLastError() == ERROR_ALREADY_EXISTS) { return(-1); }
[解决办法]
最简单的当然就是:程序每次启动都试图去创建一个全局的互斥量
系统中如果已经有程序在运行那么在创建互斥量就会返回ERROR_ALREADY_EXISTS