我的主进程通过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函数创建的是带参数的可执行文件。
有懂得指点下俺。坐等求指教
现在要保证当前系统进程中只有一个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是唯一的
如果系统存在同名的互斥量,会返回之前同名的互斥量对象句柄,并不是返回NULL.
GetLastError()为什么返回值总是0?
另外确实,把hSingle == NULL 去掉
如果GetLastError返回0,说明没有错误2、应该是和你用的项目字符集有关系,或者进程名称不同私信我,qq告诉我,帮你调试一下吧
现在你只要遍历1次就可以判断是否需要重新CreateProcess了。
把While(1)去掉吧
bStart == FALSE的时候表示程序已在运行
bStart == TRUE的时候表示程序没有运行这个要注意,我注释打少了
1 HANDLE hMutex = CreateMutex(NULL, TRUE, _T("MutexName"));
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
return(-1);
}
2 用全路径,而且循环也不对BOOL FoundProcess (LPCTSTR szexe)
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0}; // Take a snapshot of all processes in the system. hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap != INVALID_HANDLE_VALUE)
{
// Fill in the size of the structure before using it. pe32.dwSize = sizeof(PROCESSENTRY32); // Walk the snapshot of the processes, and for each process,
// display information. if (Process32First(hProcessSnap, &pe32))
{
DWORD dwPriorityClass; do
{
// Get the actual priority class.
HANDLE hProcess;
hProcess = OpenProcess (PROCESS_ALL_ACCESS,
FALSE, pe32.th32ProcessID);
dwPriorityClass = GetPriorityClass (hProcess);
CloseHandle (hProcess); // Print the process's information.
if(_tcsicmp(PathFindFileName(pe32.szExeFile), szexe) == 0)
{
bRet = TRUE;
} TRACE(_T( "fileName = %s\r\n"), pe32.szExeFile);
TRACE(_T( "\r\nPriority Class Base/t%d\r\n"), pe32.pcPriClassBase);
TRACE(_T( "PID/t/t/t%d\r\n"), pe32.th32ProcessID);
TRACE(_T( "Thread Count/t/t%d\r\n"), pe32.cntThreads); //ListProcessThread(pe32.th32ProcessID);
//ListProcessModules(pe32.th32ProcessID); }while (Process32Next(hProcessSnap, &pe32)); }
else
{
TRACE(_T( "Process32First(hProcessSnap) Error=%ld\r\n"), GetLastError() );
bRet = FALSE; // could not walk the list of processes
} // Do not forget to clean up the snapshot object.
CloseHandle (hProcessSnap);
}
return (bRet);
}
系统中如果已经有程序在运行那么在创建互斥量就会返回ERROR_ALREADY_EXISTS