C++ Prozess sanft beenden
-
Hallo,
ich starte mit CreateProcess einen Prozess.
Die Infos dazu werden in
PROCESS_INFORMATION pi
geschrieben.Wie kann ich den Prozess nun sanft beenden?
Alo nicht mit ProcessTerminateDanke für die Hilfe
-
ich selber kenne keine möglichkeiten ausser terminate, du könntest aber mal gucken wie windows das macht beim herunterfahren, wenn die applikationen beendet werden .... eine google minute später.... schau mal was ich hier gefunden hab:
http://support.microsoft.com/kb/178893/de
-
ja, das hab ich auch schon versucht:
SendMessage(pi.hProcess, WM_CLOSE, NULL, NULL);
das zeigt aber keinen effekt
-
dann würde ich da weitermachen bzw den fehler suchen ... ich kann dir leider keine coding hilfe geben, da mein C++ eher schlecht als recht ist.
-
Ein Tip.
Benutze nur die englische MSDN. Die übersetzte deutsche MSDN ist schlichtweg grausam. (http://support.microsoft.com/?scid=kb%3Ben-us%3B178893&x=3&y=10)
1. "Post a WM_CLOSE (Message) to all Top-Level windows owned by the process that you want to shut down."
-> Probiere doch mal PostMessage anstatt SendMessage
-> Poste jedem Top Level Window eine WM_CLOSE Nachricht, welche du mittels EnumWindows() bekommst2. "Use WaitForSingleObject() to wait for the handle of the process."
-> DWORD ReturnCode = WaitForSingleObject(pi.hProcess, 5000);
3. "If the return value is WAIT_OBJECT_0, then the application closed itself down cleanly"
-> if (ReturnCode == WAIT_TIMEOUT) TerminateProcess(pi.hProcess, 0);
-
Versuche es mit dem Senden von WM_DESTROY. Ist brutaler als WM_CLOSE, aber nicht unbedingt das Gelbe vom Ei.

-
Hallo,
ich hab mir mal GetLastError() ausgeben lassen
und 1400 bekommen => "System error code 1400 means "Invalid window handle." This error code may also display as "ERROR_INVALID_WINDOW_HANDLE" or as the value 0x578"Also muss irgendwas an dem Handle falsch sein...
So starte ich den Prozess
CreateProcessA("{Pfad zu meiner EXE}", "{Meine Parameter}", 0, 0, FALSE, 0, 0, "{Umgebungspfad}", LPSTARTUPINFOA(&si), &pi);Und so will ich ihn beenden:
PostMessage(pi.hProcess, WM_DESTROY, NULL, NULL);Kann mir dabei jemand helfen?
-
Ein Prozesshandle ist auch kein Fensterhandle!?
-
Oh, verdammt

Ich weiß dank google, dass ich das irgendwie mit
EnumWindows
machen muss, aber wie genau?
Bei google gibt es zwar code, aber weder funktioniert der bei mir,
noch verstehe ich ihn
-
Mit EnumWindows bekommst du die Fensterhandles aller derzeit laufenden Prozesse sofern diese einen Titel haben. Du brauchst dafür eine einfache Callback-Funktion. Wird alles in der Win32SDK-Dokumention erklärt. Nimm dann SendMessage statt PostMessage zum Killen. Diese Methode ist aber hier im Forum schon mehrfach auf erbitterten Widerstand gestossen. Man kann damit ja auch schlimmes anrichten.

-
Jah!! weil daann.. dann... kkönnte man toch .. mein.. prokramm ankreifen unt sofas fill ich nicht sen!!!1
Sofas machd man nichd laßt es pleipen ir häker1!!!!!!!!!!!!!!!!!!
tas würtet ir jah auch nichd wohlen!!!!!!!!!!!
-
Jonas4 schrieb:
Jah!! weil daann.. dann... kkönnte man toch .. mein.. prokramm ankreifen unt sofas fill ich nicht sen!!!1
Sofas machd man nichd laßt es pleipen ir häker1!!!!!!!!!!!!!!!!!!
tas würtet ir jah auch nichd wohlen!!!!!!!!!!!hahahahahahahahahahahahaha, vielen Dank für den Kommentar, der meine Stimmung komplett wiederhergestellt hat.
Naja, aalso: Danke: das hat nun geklappt.
WM_CLOSE kann ich perfekt an das Fenster senden.
Das Funktioniert auchNun möchte ich aber auch gerne Text (Tastatureingaben) an das Fenster senden.
Ich habe es mitPostMessage(Game, WM_CHAR, Word("e"), 0);versucht, was keinen effekt zeigte, und auch keinen Fehler ergab.
Dann habe ich es mitPostMessage(Game, WM_COPYDATA, Word("e"), sizeof(Word("e")));Versucht, das zeigte auch keinen Effekt, aber ich bekomme den fehlercode 1159,
womit ich leider nichts anfangen kann.
1159 = ERROR_MESSAGE_SYNC_ONLY
-
-
WM_COPYDATA: "An application must use the SendMessage function to send this message, not the PostMessage function". Wozu gibt es Dokus?
-
Auszug aus WIN32SDK:
The WM_COPYDATA message is sent when an application passes data to another application.
WM_COPYDATA
wParam = (WPARAM) (HWND) hwnd; // handle of sending window
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with dataParameters
hwnd
Identifies the window passing the data.
pcds
Points to a COPYDATASTRUCT structure that contains the data to be passed.

Im Ernst: Doku lesen und verstehen ist bei WinApi unerlässlich.
-
hmm,
aus den ganzen Anleitungen werde ich nicht immer schlau, das ist mein Problem...Ich bin jetzt mit Müh und Not auf den Code gekommen
COPYDATASTRUCT cds; char message[50]; strcpy(message, "Der zu kopierende string.\0"); cds.dwData = 0; cds.cbData = strlen(message)+1; cds.lpData = (PVOID)message; SendMessage(zielHandle, WM_COPYDATA, (WPARAM) (HWND) this->Handle, (LPARAM) (PCOPYDATASTRUCT) &cds);Der Code läuft ohne Fehler, aber leider auch ohne Effekt

Ich bin mit meinem Latein wirklich am Ende
ich habe auch schon versucht, cds.dwData mit (unsigned long)message zu füllen, auch ohne erfolg
-
WinClose schrieb:
COPYDATASTRUCT cds; char message[50]; strcpy(message, "Der zu kopierende string.\0"); // --> stcpy braucht kein \0! cds.dwData = 0; cds.cbData = strlen(message)+1; // --> +1 weg1 cds.lpData = (PVOID)message; SendMessage(zielHandle, WM_COPYDATA, (WPARAM) (HWND) this->Handle, (LPARAM) (PCOPYDATASTRUCT) &cds);// Rückgabe von SendMessage?
Du hast zwei Anwendungen, eine sendende und eine empfangende.
Zunächst die sendende Seite betrachten (Kontrollausgaben), ob alles in Ordnung ist. Dann die empfangende Seite betrachten, ob überhaupt und was unter WM_COPYDATA ankommt.Latein kannst du übrigens beim Programmieren nicht gebrauchen. Die ollen Römer kannten noch keine Computersysteme!

-
hmm
nen Fehler gibts immernoch nicht
und der Rückgabewert von SendMessage ist false.Trotz deines Codes funktioniert es nicht.
Wie kann ichd enn überprüfen, ob da Code ankommt?
mehr, als in die Textbox im anderen Fenster gucken, geht ja nicht, da ich keinen Zugriff auf den Code habe
-
Für sowas gibt es WM_SETTEXT.
-
Paula schrieb:
Für sowas gibt es WM_SETTEXT.
An welches Control der (externen) Anwendung willst du den Text denn senden?
