Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremde Anwendung schließen und auf Ende warten (https://www.delphipraxis.net/68929-fremde-anwendung-schliessen-und-auf-ende-warten.html)

alias5000 8. Mai 2006 11:59


Fremde Anwendung schließen und auf Ende warten
 
Hallo!

Also folgendes Problem: Ich schreibe gerade einen Internetupdater für ein Projekt mit mehreren Anwendungen. Um die EXE Dateien der Programme überschreiben zu können, muss ich die EXE ja schließen. Es ist aber in allen Fällen sehr wahrscheinlich, dass diese EXE aber noch geöffnet ist. Ich würde also gerne folgendes machen:
Die Anwendung, von der ich den Namen der EXE weiß, würde ich gerne auffordern, dass sie ganz normal geschlossen wird (nicht über TerminateProcess, damit sie Einstellungen und so noch speichern kann). Dies sollte meines Wissens nach mit der Message WM_CLOSE gehen, richtig?
Ich weiß allerdings noch nicht sehr viel über die Anwendung von Messages. Wie versende ich diese Nachricht, vor allem woher bekomme ich das Handle der Anwendung?

Und als zweites würde ich gerne auch noch darauf warten, bis diese Anwendung auch wirklich geschlossen wurde. Erst dann würde ich mit dem Überschreiben beginnen. Sollte die Anwendung abgestürtzt sein, würde ich es zeitverzögert über TerminateProcess versuchen, dazu habe ich in der Suche bereits einen kleinen Codeschnipsel gefunden.

Ich danke euch herzlich!

Gruß alias5000

fwsp 8. Mai 2006 12:07

Re: Fremde Anwendung schließen und auf Ende warten
 
es gibt da auch noch ShellExecuteAndWait...

fkerber 8. Mai 2006 12:19

Re: Fremde Anwendung schließen und auf Ende warten
 
Hi!

Shellexecuteandwait hilft hier glaube ich nicht weiter.
Damit kann man ein Programm starten und warten bis dieses wieder beendet wurde, bevor es mit dem eigenen Programm weitergeht.


Ciao Frederic

alias5000 8. Mai 2006 16:48

Re: Fremde Anwendung schließen und auf Ende warten
 
Ja das Problem ist eigentlich, dass die Uranwendung den Updater ausführen wird und der das Urprogramm dann evlt. schließen soll.
Oder mal ne andere konkrete Frage: Wie komme ich an das HNWN von meinem Programm, wenn ich den EXE Namen hab?

Klaus01 8. Mai 2006 17:57

Re: Fremde Anwendung schließen und auf Ende warten
 
sollte das nicht mit GetModuleHandle der win API gehen?
Link -> http://www.swissdelphicenter.ch/torr...ode.php?id=910
und
-> http://www.delphi-fundgrube.de/faq08.htm#topic0802

Grüße
Klaus

nat 8. Mai 2006 21:23

Re: Fremde Anwendung schließen und auf Ende warten
 
ich hab ma sowas am beispiel von notepad gemacht.
vll hilft dir das ja weiter.

versucht erst das fenster per WM_CLOSE zu schliessen und
wenn das nach nem gewissen timeout nich geklappt hat per
TerminateProcess.

Delphi-Quellcode:
var
  hWnd, hProcess: THandle;
  DWResult, PID: Cardinal;
begin
  hWnd := FindWindow('Notepad', nil);
  if hWnd <> 0 then
  begin
    SendMessageTimeout(hWnd, WM_CLOSE, 0, 0,
      SMTO_ABORTIFHUNG or SMTO_NORMAL, 6000, DWResult);

    if IsWindow(hWnd) then
    begin
      GetWindowThreadProcessId(hWnd, PID);

      hProcess := OpenProcess(PROCESS_TERMINATE, False, PID);
      if hProcess <> 0 then
      begin
        TerminateProcess(hProcess, 0);
        CloseHandle(hProcess);
      end;
    end;
  end;
end;

alias5000 8. Mai 2006 22:09

Re: Fremde Anwendung schließen und auf Ende warten
 
Danke, euch allen. Ich hab inzwischen etwa sowas, wie von nat bereits hinbekommen. Allerdings hatte ich mich noch nicht mit dem aufs Ende warten so sehr auseinandergesetzt, weil ich da noch was anderes mit einbauen wollte. Im Endeffekt wird es aber auf diesen Code in etwa hinauslaufen.

Vielen Dank!

Gruß
euer alias5000


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz