2011-06-27 9 views
6

Używam aplikacji ShellExecuteEx do uruchamiania aplikacji. Po pomyślnym uruchomieniu, należy przeczytać TShellExecuteInfo.hProcess, aby uzyskać uchwyt rozpoczętego procesu.Sposób sprawdzania, czy dany proces działa przy posiadanym uchwycie.

Chciałbym okresowo sprawdzić, czy proces uruchomiony przez moją aplikację nadal działa. Dwa lub więcej procesów o tej samej nazwie może działać jednocześnie i chcę mieć pewność, że moja aplikacja sprawdza poprawny proces.

Chcę móc to zrobić w systemach Windows z Windows 2000 i wyżej.

Wiem, że istnieje funkcja WinAPI GetProcessId który robi dokładnie to, co chcę, ale to nie obsługuje systemu Windows 2000.

Dziękuję za odpowiedzi.

+0

Ponieważ masz do czynienia z procesem, nie wiem, co masz na myśli przez "chcę mieć pewność, że moja aplikacja sprawdza prawidłowy proces". Jak może to nie być prawidłowy proces, skoro masz już uchwyt? –

+0

@David Czułem, że muszę podkreślić moje wymagania, na wypadek gdyby ktoś mógł zaproponować mi rozwiązanie takie jak to: http://www.delphitricks.com/source-code/windows/check_if_a_process_is_running.html – Wodzu

Odpowiedz

14

Zadzwoń pod numer WaitForSingleObject na tym uchwycie i użyj parametru limitu czasu równego zero. Jeśli proces nadal trwa, funkcja zwróci Wait_Timeout; jeśli proces został zakończony, a następnie powróci Wait_Object_0 (bo zakończenie procesu powoduje jego uchwyty stać zasygnalizował.)

Jeśli chcesz wiedzieć, jaki jest status wyjścia z procesu, a następnie zadzwonić GetExitCodeProcess.

+0

Możesz po prostu zadzwonić do 'GetExitCodeProcess 'przetestuj ponownie wartość zwracaną' STILL_ACTIVE'. –

+1

O ile kod wyjścia * nie jest * 'Still_Active', @David. Wtedy nadal potrzebujesz innego sposobu na rozróżnienie, a jeśli w rzeczywistości * nie obchodzi cię, czym jest kod wyjścia, może równie dobrze wywołać 'WaitForSingleObject'. –

+0

Bardzo dziękuję za pomoc :) – Wodzu

Powiązane problemy