Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   WinExecAndWait32 wartet nicht (https://www.delphipraxis.net/153865-winexecandwait32-wartet-nicht.html)

hoika 18. Aug 2010 13:09

WinExecAndWait32 wartet nicht
 
Hallo #,

ich habe hier eine Variante von WinExecAndWait32.
Das darin gestartete Programm1 ruft über ShellExecute (?) Programm2 auf und beendet sich.

Nach der Beendigung von Programm1 bekomme ich die Kontrolle von WinExecAndWait32 zurück.
In der Zwischenzeit läuft aber Programm2 weiter.

Wie bekomme ich es hin, dass ich warte, bis auch Programm2 beendet ist.

Hier der Code

Delphi-Quellcode:
function Run_EXE(Params: string; var ExitCode: Cardinal;
  ShowMinimized: boolean): Boolean;
var                           //True wenn exe gelaufen, unabhängig vom ExitCode
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
    fillchar(SI, SizeOf(SI), 0);
    SI.cb := SizeOf(SI);
    SI.dwFlags := STARTF_USESHOWWINDOW;
    if  ShowMinimized
    then SI.wShowWindow := SW_SHOWMINIMIZED
    else SI.wShowWindow := SW_SHOWNORMAL;
    if CreateProcess(nil, PChar(Params), nil, nil, false,
      CREATE_DEFAULT_ERROR_MODE and HIGH_PRIORITY_CLASS, nil, nil, SI, PI) then
    begin //backup läuft
      while (waitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT) do
        Application.ProcessMessages;
      GetExitCodeProcess(PI.hProcess, ExitCode);
      CloseHandle(PI.hThread);
      CloseHandle(PI.hProcess);
      Result := True;
     
    end //backup läuft
    else
    begin //CreateProcess fehlgeschlagen
     // error message
     
      Result := False;
    end;
end;

Danke


Heiko

ralfschwalbe 18. Aug 2010 13:52

AW: WinExecAndWait32 wartet nicht
 
Hallo,

Du brauchst hProcess von Programm2. Das bekommst Du mit GetWindowThreadProcessId, aber nur wenn Du ein Festerhandle hast. Ansonsten mit CreateToolhelp32Snapshot, Process32First und Process32Next durch alle Prozesse gehen und Dir Deinen von Programm2 rauspicken. Der Rest geht mit waitForSingleObject wie in Deinem Code.

hoika 18. Aug 2010 16:42

AW: WinExecAndWait32 wartet nicht
 
Hallo,

ist ja leider nicht mein Programm2.
Das ist das Uninstall-Programm von Wise (einer uralten Version).

Den erzeugte Prozess über vergleichen rausfinden,
ist wohl ziemlich ungenau ...


Heiko

himitsu 18. Aug 2010 16:48

AW: WinExecAndWait32 wartet nicht
 
Beim Erstellen/Laden von Programm1 die Funktion hooken, welche das Programm2 startet und sich dort das Handle von Programm2 auslesen.

Oder Eben doch das Handle von Programm1 nehmen und nachträglichg schauen welches Programm von diesem gestartet wurde.

Irgendwo in den SnapShots sollte drinstehn, welches das startende Programm war.

ralfschwalbe 19. Aug 2010 07:02

AW: WinExecAndWait32 wartet nicht
 
@Hoika: Weißt Du welchen Namen das Programm2 hat? Bei Wise hab ich keine Ahnung, aber beim alten Installshield hat die Setup.exe für den eigentlichen Installer fast immer den gleichen Namen erzeugt (mit wenigen Ausnahmen).

hoika 19. Aug 2010 07:16

AW: WinExecAndWait32 wartet nicht
 
Hallo,

das Programm hat erst mal Pause.
Aber das mit dem Namen ist eine gute Idee.
Der Prozess ist immer der gleiche.

Wenn etwas Zeit ist, setze ich mich da mal ran.

Danke


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.

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