我做的一个应用程序,要在执行时检查是否已经在运行了。
HANDLE hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"my.exe");       
       if(!hMutex)       
       {       
HANDLE m_hMutex=CreateMutex(NULL,TRUE,"my.exe");
if(GetLastError()==ERROR_ALREADY_EXISTS)         <--但是在这取到的GetLastError 的值是0
{
CloseHandle(m_hMutex);                      m_hMutex是有值的
m_hMutex=NULL;                              
                                                                     该怎么解决呢???
}
}
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
if(hProcessSnap != INVALID_HANDLE_VALUE) 

PROCESSENTRY32  pe32; 
pe32.dwSize=sizeof(pe32); 
BOOL   bMore=Process32First(hProcessSnap,&pe32); 
DWORD pID=GetCurrentProcessId();
    HANDLE pHandle;

while(bMore) 

if(pe32.th32ProcessID!=pID&&!strcmp(pe32.szExeFile, MutexName)) 

              if(MutexName=="Tracetest1.exe")
  {
  pHandle=OpenProcess(PROCESS_TERMINATE,FALSE,pID);             
                  TerminateProcess(pHandle,0);
  }
                        }
                     ....
                 } 
        }       用这个会把我后运行的这个进程本身杀死,而不是把原来内存中已经存在的进程杀死?

解决方案 »

  1.   

    if(pe32.th32ProcessID!=pID&&!strcmp(pe32.szExeFile,   MutexName))  
    ===================
    if((pe32.th32ProcessID!=pID)&&(strcmp(pe32.szExeFile,   MutexName)==0))  
      

  2.   

    OpenProcess带的那个ProcessID是谁的?
      

  3.   

    一般是先 HANDLE   m_hMutex=CreateMutex(NULL,TRUE,"my.exe"); 如果你先前的程序在运行,那么用它来创建的时候会返回 ERROR_ALREADY_EXISTS.
      

  4.   

    回5楼 flyprogrammer :我用了
    HANDLE   m_hMutex=CreateMutex(NULL,TRUE,"my.exe"); 
    if(GetLastError()==ERROR_ALREADY_EXISTS) 
    但是得不到错,我debug查的getlasterror中的值是0
      

  5.   

    回3楼unsigned :openprocess的进程ID是找到与"my.exe"匹配的进程的值,但是问题是我自己现在的程序和先前的程序名是一样的,所以他分不出前面和后面的进程,而把我后打开的进程关掉了。
      

  6.   

    回7楼 aaronwang81  :因为我这个函数不止用来结束自己的进程,还要检查别的进程
      

  7.   

    拜托,传给OpenProcess的ProcessID使用的是当前进程的ID(使用GetCurrentProcessID取得),我都已经提示过了,竟然还没有发现?
      

  8.   

    哈,我一直当是那个匹配文件名的进程ID了。OK,我去试。^^
      

  9.   

    现在还是不行,虽然改过来了,
     pHandle=OpenProcess(PROCESS_TERMINATE,FALSE,pe32.th32ProcessID);但是openprocess失败,pHandle值为0,我getlasterror返回值87,参数错误,why?怎么解决?
      

  10.   

    你先把自己的程序权限提高(SeDebugPrivilege)
    尝试使用PROCESS_ALL_ACCESS来OpenProcess