(Borland C++...) Laufendes Programm beenden



  • Ich würde gerne eine laufende .exe Datei beenden. Kann man dies direkt tun oder muss man die thread id herausfinden und diesen dann beenden? (Wie findet man eine thread id heraus?)

    mfg Gen.d.Pz.Tr.Seb



  • Für derart Windows-Spezifische Geschichten gibts nur WinAPI-Lösungen
    -> Verschoben



  • ich würde den Fenster-Handle der Applikation ermitteln z.B. mit FindWindow (KlassenName, NULL) und dann einen SendMessage (hWnd, WM_CLOSE, 0, 0) schicken. Das ist auf jeden Fall die sauberere Methode, weil die Applikation dann so beendet wird, wie wenn der Bediener das Fenster schließen würde und evtl. allocierter Speicher freigegeben wird.



  • Schau mal in die FAQ.



  • danke webbi :p



  • Kleiner Hinweis;

    Das "danke webbi" stammt nicht von mir (hab diese Thema angefangen (war da noch nicht registriert))

    So eine Unhöfflichleit würde ich mir nie erlauben!



  • Ich habs versucht kenn mich aber mit FindWindow und SendMessage nicht wirklich aus.

    Was ist IPClassName und IpWindowName (FindWindow)

    Könnte mir vielleicht jemand ein kleines Beispiel zeigen.

    Gen.d.Pz.Tr.Seb



  • Keine Ahnung, obs hilft :

    hwnd hwndWinamp = FindWindow("Winamp v1.x",NULL);

    Der findet das von Winamp...
    dann kann mit dem HWND Winamp "steuern", z.B. nächster Track...



  • Es heißt natürlich HWND, nicht hwnd...



  • So eine Unhöfflichleit würde ich mir nie erlauben!

    Seid wann ist Danke sagen denn unhöflich? 😕



  • Original erstellt von Gen.d.Pz.Tr.Seb:
    **Ich habs versucht kenn mich aber mit FindWindow und SendMessage nicht wirklich aus.

    Was ist IPClassName und IpWindowName (FindWindow)

    Könnte mir vielleicht jemand ein kleines Beispiel zeigen.
    **

    MSDN ist voller Beispiele und Anweisungen



  • Sorry Leute aber ich kenn mich weder bei der WinAPI gut aus, noch bei MSDN. Ich werde mir aber Mühe geben. (Vor allem was MSDN betrifft (gleich mal hin schauen))

    mfg

    Gen.d.Pz.Tr.Seb



  • MSDN ist so richtig super, wenn man sehr wenig von der winapi versteht. Hab mittlerweile einige Möglichkeiten gefunden um eine process zu beenden. TerminateProcess zum Beispiel. Jetzt mein kleines Problem;

    BOOL TerminateProcess(
    HANDLE hProcess,
    UINT uExitCode
    );

    Parameters
    hProcess
    [in] Handle to the process to terminate.
    The handle must have the PROCESS_TERMINATE access right. (steht in der MSDN)

    Da ich mich nicht wirklich mit Handels auskenn hab ich gleich nachgeschaut, und versteh von dem Ganzen was da steht eigentlich Null. Zumindest in Bezug auf Process beenden. Jetzt steh ich wieder am Anfang.

    seufz....



  • TerminateProcess sollte man aber nur im äußersten notfall benutzen.



  • Tut mir leid aber....

    MITTLERWEILE IST ES MIR VÖLLIG WURSCHT WIE ICH DAS PROGRAMM SCHLIEßE

    es soll wenn geht nicht zu kompliziert sein, und einfach nur funktionieren.



  • Du mußt Dir per OpenProcess() (siehe MSDN) erst einen Handle auf den Prozeß holen.

    Wie gesagt ist TerminateProcess() nicht gut, um Programme zu beenden (es wird kein reservierter Speicher freigemacht usw., Du trittst dem Programm quasi "die Beine weg").

    Such mit FindWindow (KlassenName, FensterTitel) Dein Programm (dann haste ein HWND (=Handle to a WiNDow) und kannst dann an dieses HWND die Message WM_CLOSE senden. Das geht per

    SendMessage(HWND, WM_CLOSE, NULL, NULL);
    

    Das wäre dann als ob der User das Programm normal beendet hätte (mit dem X oben rechts oder aber über DATEI --> Beenden).

    Wenn Du mehr Fragen hast, frag...



  • Hat der Code von WebFrizi nicht funktioniert?! 😕



  • Jetzt ist es mir endlich gelungen ein window zu schließen.

    Nächste Frage; Wie schließe ich eine Prozess? (Die die im Taskmanager unter Prozesse stehen kann ich irgendwie nicht schließen).

    Das Programm vom WebFrizi hat nicht funktioniert. Auserdem ist es sehr lang und ich will die Größe meines Programmes (eher) klein halten.



  • Da solltest Du Dir mal die Funktion EnumWindows() ansehen. Die ist genauer als FindWindow() bzw. sie findet auch Anwendungen, die ihr Fenster nicht anzeigen (=z. B. Prozesse im TaskManager).

    In der dazugehörigen EnumWindowsProc() hast Du dann ein HWND auf ein Fenster, Du brauchst nun nur noch abprüfen, ob es sich um das gewünschte Programm handelt und es schließen.

    Ich überprüfe meist auf den Namen der EXE inkl. Programmpfad.
    Hab mir hier eine Funktion geschrieben, der ich einen HWND und einen Zeiger auf einen String, der dann den Pfad ink. EXE beinhaltet.

    Achtung, diese Funktion funktioniert in dieser Form nur unter NT-basierenden Betriebssystemen (WinNT, Win2000, WinXP).

    #include <Psapi.h>
    #pragma comment(lib, "psapi.lib") //...oder psapi.lib dem Projekt hinzufügen in der IDE
    
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
        DWORD lpdwProcessId; 
        HANDLE hProcessHandle;
    
        GetWindowThreadProcessId(hWnd, &lpdwProcessId); 
        hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
        GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
        CloseHandle(hProcessHandle);
    }
    

    Aufrufen tust Du die Funktion in der EnumWindowsProc(), die ja einen HWND zum bearbeiten von EnumWindows() bekommen hat...
    Dann vergleichst Du den Pfad des HWND mit dem Pfad des Programmes, das Du beendet willst (z. B. "C:\Programme\Winamp\Winamp.exe") und sobald die beide gleich sind RUMMS... WM_CLOSE... und Ruhe ist.

    Wie gesagt, funzt in der Version nur unter NT/2K/XP.

    Allerdings sehe ich auch keinen Grund, WebFritzis Funktion NICHT zu benutzen.... ich bin mir sicher sie funktioniert, und was großartig anderes hab ich hier auch nicht gezeigt... wirst Du auch "kleiner" nicht hinkriegen!

    [ Dieser Beitrag wurde am 20.06.2003 um 07:49 Uhr von Hepi editiert. ]



  • Jenachdem, was du machen willst, sind diese 2 Links auch noch ganz interessant:
    - Process Walking
    - Taking a Snapshot and Viewing Processes



  • Ich hab mich jetzt mit den beiden Enum Funktionen audeinandergesetzt komm jedoch mit den Parametern nicht ganz klar (MSDN hat mir natürlich nicht geholfen). Vielleicht würde ein kurzes Beispiel helfen? (Übrigens; den Code von Hepi hab ich wenigstens verstanden (und find ihn nicht schlecht))

    Das mit dem Snapshot hab ich auch schon probiert jedoch macht mir da mein Compiler Schwierigkeiten weil er GetProcessModule(...) nicht kennt.

    Langsam wird das zu einer unendlichen Geschichte.


Anmelden zum Antworten