Alle Tasks eines bestimmten Programms beenden



  • Moin,

    mit meinen Programm update.exe möchte ich das Programm app.exe das sich im Verzeichniss C:\Program Files\myApp befindet updaten. Dazu muss ich natürlich sicherstellen, daß C:\Program Files\myApp\app.exe nicht mehr läuft. Also im Taskmanager ist app.exe ja je nach gestarteter Anzahl sichtbar. Wie ist nun die Vorgehensweise, dass ich app.exe identifiziere und sauber beende?

    Rüdiger


  • Mod

    Lass die Anwendung eine eigene Fensterklasse verwenden mit einem Namen, der für Dich unverwechselbar ist. Dann kannst Du mit FindWindow alle Fenster dieser Ausprägung finden.



  • Martin Richter schrieb:

    Lass die Anwendung eine eigene Fensterklasse verwenden mit einem Namen, der für Dich unverwechselbar ist. Dann kannst Du mit FindWindow alle Fenster dieser Ausprägung finden.

    Grundsätzlich keine schlechte Idee. Aber angenommen der User hat 2 Verzeichnisse in denen die app.exe läuft. Z.B. "C:\1\app.exe" und "C:\2\app.exe" beides mal ist die app.exe gestarte. Die update.exe wird aber von "C:\1\app.exe" mit der Commandline
    "update.exe /app "C:\1\app.exe"" aufgerufen, somit weiss update.exe, dass die Dateien in "C:\1\." upgedated werden sollen. Somit ist es auch nur notwendig alle Prozesse von "C:\1\app.exe" zu beenden, "C:\2\app.exe" jedoch kann weiterlaufen. Aus diesem Grund möchte ich die Liste der Tasks durchgehen und nachschauen wo überall "C:\1\app.exe" gestartet wurde.
    Ich denke mal ich muss wohl irgendwie mit EnumProcesses(...) anfangen, jedoch weiss ich nicht wie ich dann weitermachen muss, möglicherweise ist jedoch dieser Ansatz schon falsch? Wer kann helfen?

    Rüdiger


  • Mod

    Auch das wäre kein Problem. Du könntest über Fenster den Prozess ermittelnund anhand des Prozesses das Executable.



  • Ok, ich bin nun schon soweit, dass ich die gewünschetn Prozesse identifizieren kann. Leider weiss ich nicht wie ich über den Prozesshandle an den Fensterhandle komme, wer kann helfen?

    Rüdiger

    boolean ShutdownApplication(char *prove_filename){
    
    	HANDLE		hProcess;
    	DWORD			dProcess[1024];
    	char			filename[1024];
    	int			i, num;
    
    	if(EnumProcesses(dProcess, sizeof(dProcess), &num) == FALSE){
    		return FALSE;
    	}
    	num = num/sizeof(DWORD);
    	for(i = 0; i < num; i++){
    //		hProcess = OpenProcess((PROCESS_QUERY_INFORMATION | PROCESS_VM_READ), TRUE, dProcess[i]);
    		hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dProcess[i]);
    		if(!hProcess){
    			continue;
    		}
    		GetModuleFileNameEx(hProcess, NULL, filename, sizeof(filename));
    		if(_stricmp(prove_filename, filename) == 0){
    
    //			hier hackt es nun, wie komme ich an den Fensterhandle?
    //			SendMessage(hFenster, WM_CLOSE, 0, 0);
    
    		}
    		CloseHandle(hProcess);
    	}
    	return TRUE;
    }
    


  • Hallo,

    eher so: erst über EnumWindows alle Top-Level-Fenster durchgehen, dann in der zugehörigen EnumWindowsProc das empfangene Handle an GetWindowThreadProcessId übergeben, mit GetModuleFileNameEx kann geprüft werden, ob es sich um die "richtige" ausführbare Datei handelt.

    MfG,

    Probe-Nutzer


  • Mod

    Probe-Nutzer schrieb:

    eher so: erst über EnumWindows alle Top-Level-Fenster durchgehen, dann in der zugehörigen EnumWindowsProc das empfangene Handle an GetWindowThreadProcessId übergeben, mit GetModuleFileNameEx kann geprüft werden, ob es sich um die "richtige" ausführbare Datei handelt.

    Sehe ichauch so. Habe es auch so empfohlen, allerdings will der OP ja nicht hören 🕶


Anmelden zum Antworten