Externes Programm schließen
-
In der FAQ hab ich gefunden, wie man ein Externes Programm öffnet.
Nun möchte ich folgendes machen:- Prüfen, ob Outlook Express geöffnet ist, wenn ja, Outlook Express schließen
- Auf die dbx-Dateien von OE zugreifen (das geht nur, wenn OE geschlossen ist!!!)
- OE wieder starten.
Punkt 2 und 3 habe ich schon mit Hilfe dieses Forums gelöst. Jetzt fehlt noch Punkt 1. Ich muss davon ausgehen, dass OE manuell bzw. beim WIndowsstart geöffnet wurde und nicht durch das Programm.
Ich habe wirklich schon alles hier durchsucht, aber immer nur das Beispiel zu ShellExecute gefunden, was ja bekanntlich eine Anwendung öffnet
-
TerminateProcess() ist einen nette WinAPI-Funktion. Setzt allerdings voraus, dass du das Handle auf die Applikation hast. Îch schiebe dich mal ins WinAPI-Forum.
->Verschoben
-
FindWindow -> GetWindowThreadProcessId -> http://c-plusplus.net/forum/viewtopic.php?t=39369
-
Hmm... also nach Meinung der MSDN ist TerminateProcess() so ziemlich der letzte Ausweg (quasi Handbremse, Rettungsanker und Lenkrad ganz nach rechts).
Ich würde per SendMessage einfach WM_CLOSE an Outlook Express senden, dann mich um die dbx-Dateien kümmern und dann OE per ShellExecute() wieder starten...
TerminateProcess() würde ich nur nutzen, wenn es mit WM_CLOSE absolut nicht klappen will...
-
Vorallem wir mit TerminateProcess nur der Process und alle Threads beendet alle DLL's bleiben aber im Speicher
-
Anre schrieb:
alle DLL's bleiben aber im Speicher
Unfug. Die Dlls erhalten lediglich keine Benachrichtigungen. Auf DLL_THREAD_DETACH und DLL_PROCESS_DETACH wirst Du deswegen vergeblich warten.
-
Ich weiß, dass das Thema nervt, wie Sau. Ist ja auch schon einiges hier im Forum drüber geschrieben worden.
Was ich aber nicht gefunden habe ist:Ich habe mir das Handle des Threads gemerkt, da ich den Thread in meinem eigenen Programm auch aufgerufen habe:
CWinThread *l_cwinthread = AfxBeginThread(ThreadFunktion, (LPVOID)m_Person); t_hThread = l_cwinthread->m_hThread;
Ich würde den Thread auch gerne wieder durch den Handle schliessen, da ich mit FindWindow ja die Titelleiste des zu schliessenden Programmes kennen müsste, was aber nicht immer der Fall ist.
Mit
TerminateProcess(t_hThread,0);
oder
TerminateThread(t_hThread,0);
passiert aber leider momentan garnichts. (D.h. das externe Programm läuft weider)
Leider hab ich noch nichtmal das neue Programm durch die Funktionen schliessen können, die Flenders und WebFritzi hier bereitgestellt hatten, da FindWindow() ein CWnd* zurückgibt, aber im Code von WebFritzi ein HWND als Rückgabetyp erwartet wird.
Kann mir jemand einen Tip zu der Handle-Sache oder meinem Fehler beim Einsetzen von WebFritzis und Flenders Code geben??
Vielen Dank
-
FindWindow gibt dir ein HWND zurück -> evtl. gibt's bei MFC eine Funktion, dir dir nen CWnd* zurücklierfert, aber nicht die WinAPI-Funktion :p
-
Dankeschön flenders.
Daran lag es natürlich. Ich hatte die FindWindow der MFC benutzt.
Jetzt funktioniert es.