Detectando si un proceso sigue ejecutándose

Necesito verificar si un proceso con una MANIJA dada todavía se está ejecutando, traté de hacerlo usando el siguiente código, sin embargo, siempre se devuelve en el segundo retorno falso, incluso si el proceso se está ejecutando.

bool isProcessRunning(HANDLE process) { if(process == INVALID_HANDLE_VALUE)return false; DWORD exitCode; if(GetExitCodeProcess(process, &exitCode) != 0) return false;//always returns here return GetLastError() == STILL_ACTIVE;//still running } 

Puedes probar la vida del proceso usando

 bool isProcessRunning(HANDLE process) { return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT; } 

http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx

Valor de retorno

Si la función tiene éxito, el valor devuelto es distinto de cero.

Si la función falla, el valor de retorno es cero. Para obtener información de error extendida, llame a GetLastError .

Sé que es un poco tarde, pero su código debería leerse así si quiere los resultados que espera.

 bool isProcessRunning(HANDLE process) { DWORD exitCodeOut; // GetExitCodeProcess returns zero on failure if( GetExitCodeProcess( process, &exitCodeOut ) == 0 ) { // Optionally get the error // DWORD error = GetLastError(); return false; } // Return if the process is still active return exitCodeOut == STILL_ACTIVE; } 

Si solo tiene el ID de proceso (PID), este fragmento funcionará (sin comprobación de errores):

 bool isProcessRunning(DWORD processID) { if( HANDLE process = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID ) ) { DWORD exitCodeOut; // GetExitCodeProcess returns zero on failure if( GetExitCodeProcess( process, &exitCodeOut ) != 0 ) { // Return if the process is still active return exitCodeOut == STILL_ACTIVE; } } return false; } 

Puede usar EnumProcesses() para ejecutar todos los procesos en Windows. Algo como:

 bool IsProcessRunning(int pid) { unsigned long processes[2048]; unsigned long num_proc = 0; unsigned long needed = 0; // assume that 2048 processes are enought if (EnumProcesses(processes, sizeof(processes), &needed)) num_proc = needed / sizeof(DWORD); for (int i = 0; i < num_proc; i++) if (processes[i] == pid) return true; return false; }