我的主进程通过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函数创建的是带参数的可执行文件。
有懂得指点下俺。坐等求指教

解决方案 »

  1.   

    不要判断进程名称,可能有多个相同名称的进程
    而要判断进程id,一个系统下进程id是唯一的
      

  2.   

    if(hSingle == NULL && ERROR_ALREADY_EXISTS == GetLastError())
    如果系统存在同名的互斥量,会返回之前同名的互斥量对象句柄,并不是返回NULL.
      

  3.   


    GetLastError()为什么返回值总是0?
      

  4.   

    1、是在你父进程中做,也就是说只有父进程才能确保只存在一个进程。
    另外确实,把hSingle == NULL 去掉
    如果GetLastError返回0,说明没有错误2、应该是和你用的项目字符集有关系,或者进程名称不同私信我,qq告诉我,帮你调试一下吧
      

  5.   

    当初我是监视程序,因此需要while(1)
    现在你只要遍历1次就可以判断是否需要重新CreateProcess了。
    把While(1)去掉吧
      

  6.   

    我原来代码中是
    bStart == FALSE的时候表示程序已在运行
    bStart == TRUE的时候表示程序没有运行这个要注意,我注释打少了
      

  7.   


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

  8.   

    最简单的当然就是:程序每次启动都试图去创建一个全局的互斥量
    系统中如果已经有程序在运行那么在创建互斥量就会返回ERROR_ALREADY_EXISTS