Prüfen ob ein Prozess läuft



  • Hi

    Ich will überprüfen ob ein Prozess läuft und habe dazu folgende Funktionen:

    HANDLE GetProcessHandle(CString csProcessName)
    {
    	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 proc;
    	proc.dwSize = sizeof(PROCESSENTRY32);
    	Process32First(snapshot, &proc);
    	CString tmp;
    	do
    	{
    		tmp = proc.szExeFile;
    		if (tmp == csProcessName)
    			CloseHandle(snapshot);
    		   return OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,proc.th32ProcessID);
    	}while (TRUE == Process32Next(snapshot, &proc) );
    	CloseHandle(snapshot);
    	return NULL;
    }
    

    und

    bool hProcessRunning(HANDLE hProcess)
    {
    	if(GetPriorityClass(hProcess) != 0){
    		return true;
    	}
    	return false;
    }
    

    Allerdings liefert mir hProcessRunning immer ein false zurück. Egal ob der Prozess läuft oder nicht.

    Kann mir jemand sagen warum?



  • ... Prozess läuft ...

    Definier das mal.



  • Ob der Prozess existiert und auf anfragen reagiert (nicht abgestürzt ist).



  • Hallo,

    ich habe mal sowas änliches gemacht aber auch so änlich wie du.
    was für ein prozess ist das den den du beowachten möchtest?

    MFG TaccoGo



  • the_alien schrieb:

    Ob der Prozess existiert und auf anfragen reagiert (nicht abgestürzt ist).

    Definiere "Anfragen" und "abgestürzt sein". Nach meiner Meinung läuft ein "abgestürzter" Prozess nicht mehr.

    Ist dir klar, was dir GetPriorityClass liefert?



  • MFK schrieb:

    Definiere "Anfragen" und "abgestürzt sein". Nach meiner Meinung läuft ein "abgestürzter" Prozess nicht mehr.

    Definiere "läuft".
    Ich will einfach wissen ob der Prozess läuft oder nicht... wie soll ich das denn jetzt noch groß definieren?
    Isser da oder isser nicht da?

    MFK schrieb:

    Ist dir klar, was dir GetPriorityClass liefert?

    Ja.
    Nämlich nen Fehler wenn das Handle ungültig ist und der Prozess nichtmehr läuft. Zumindest laut MSDN.

    TaccoGo schrieb:

    was für ein prozess ist das den den du beowachten möchtest?

    Erstmal ist es für den Windows Script Host (wscript.exe) angedacht. Sollte aber auch jedweden anderen Prozess überwachen können.

    bool ProcessRunning(CString csProcessName)
    {
    	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 proc;
    	proc.dwSize = sizeof(PROCESSENTRY32);
    	Process32First(snapshot, &proc);
    	CString tmp;
    	do
    	{
    		tmp = proc.szExeFile;
    		if (tmp == csProcessName){
    			CloseHandle(snapshot);
    			return true;
    		}
    	}while (TRUE == Process32Next(snapshot, &proc) );
    	CloseHandle(snapshot);
    	return false;
    }
    

    Wenn ich es so mache funktioniert es. Nur ist es nicht umbedingt die beste Lösung immer die gesamte Prozesstabelle durchzusuchen ob die exe da drin steht.

    Für das derzeitige Projekt ist es erstmal egal. Aber wo ist der Denkfehler in den obenstehenden Funktionen?



  • Hallo,

    alle durchsuchen ist auch ne möglichkeit.

    wegen den code oben fileicht hat es was mit den CloseHandle() zutun.
    probirs mal so:

    HANDLE GetProcessHandle(CString csProcessName) 
    { 
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
        PROCESSENTRY32 proc; 
        proc.dwSize = sizeof(PROCESSENTRY32); 
        Process32First(snapshot, &proc); 
        CString tmp; 
        do 
        { 
            tmp = proc.szExeFile; 
            if (tmp == csProcessName) 
                HANDLE h_proc=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,proc.th32ProcessID); 
                CloseHandle(snapshot); 
               return h_proc;
         }while (TRUE == Process32Next(snapshot, &proc) ); 
        CloseHandle(snapshot); 
        return NULL; 
    }
    

    MFG TaccoGo



  • Ich will einfach wissen ob der Prozess läuft oder nicht... wie soll ich das denn jetzt noch groß definieren?
    Isser da oder isser nicht da?

    Wenn er nicht da ist bekommst du auch kein handle darauf mit Process32First/Next. Sobald du ein handle auf nen Prozess bekommst, hat der zum Zeitpunkt von CreateToolhelp32Snapshot auch existiert.
    Wenn du checken will ob der Prozess zwischen dem CreateToolhelp32Snapshot Aufruf und jetzt beendet wurde mache in WaitForSingleObject(hProcess,0) auf das handle. Kommt ein WAIT_OBJECT_0 zurück wurde er beendet.



  • Ah danke, das wars CMatt 🙂


Anmelden zum Antworten