Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozess starten und warten (https://www.delphipraxis.net/147-prozess-starten-und-warten.html)

Gast 14. Jun 2002 07:52


Prozess starten und warten
 
Hallo,

Prozess starten und warten

Aus einem Setup-Programm sollte ein anderer Programm gestartet werden (hier die Datei: Auto.Exe) und dann sollte das Setup-Programm auf das Ende des Prozesses warten....

Leider, startet die Auto.Exe überhaupt nicht...

Wo mache ich hier Fehler?

[code:1:1b3f5e910e]
VAR

MathiasSimmack 14. Jun 2002 08:42

Hier weiß ich 100%, woher ich die Funktion habe. Von den JEDIs, und sie funktioniert prima:
Code:
function WinExec32AndWait(const Cmd: string; const CmdShow: Integer): Cardinal;
var
  sui : TStartupInfo;
  pi : TProcessInformation;
begin
  Result := Cardinal($FFFFFFFF);
  ZeroMemory(@sui,sizeof(TStartupInfo)); sui.cb := SizeOf(TStartupInfo);
                                         sui.dwFlags := STARTF_USESHOWWINDOW;
                                         sui.wShowWindow := CmdShow;

  if(CreateProcess(nil,pchar(Cmd),nil,nil,False,NORMAL_PRIORITY_CLASS,nil,nil,sui,pi)) then
    begin
      WaitForInputIdle(pi.hProcess, INFINITE);
      if(WaitForSingleObject(pi.hProcess, INFINITE) = WAIT_OBJECT_0) then
        begin
          {$IFDEF DELPHI3}
          if not GetExitCodeProcess(pi.hProcess, Integer(Result)) then
          {$ELSE}
          if not GetExitCodeProcess(pi.hProcess, Result) then
          {$ENDIF DELPHI3}
            Result := Cardinal($FFFFFFFF);
        end;
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
    end;
end;
btw: ich verwende diese Funktion auch in meinem Setup, um alte Versionen (Registry) zu entfernen, bevor dann die neue Installation startet. Wie gesagt, klappt sehr gut!

Gruß,
Mathias.

Gast 14. Jun 2002 08:50

Hi Mathias, :P

gleich werde Deine Funktion ausprobieren und hier Bescheid sagen...

sage mir aber noch bitte... wie ist das RESULT dieser Funktion zu bewerten?

Erläutere es bitte...

Gruß

Paul Jr.

jbg 14. Jun 2002 09:35

Re: Prozess starten und warten
 
Zitat:

Zitat von Paul Jr.
Leider, startet die Auto.Exe überhaupt nicht...

Vielleicht enthält der Pfad, den du über ExtractFilePath(ParamStr(0)); ermittelst Leerzeichen. Dann musst du nämlich den Programmnamen in Anführungszeichen setzen.
Code:
if Pos(' ', sSetupAufruf) > 0 then sSetupAufruf := '"' + sSetupAufruf + '"';
-----------------------
Zitat:

sage mir aber noch bitte... wie ist das RESULT dieser Funktion zu bewerten?
Wenn Result den Wert $FFFFFFFF liefert, dann trat ein Fehler auf. Entweder ist die Anwendung gar nicht erst gestartet worden, oder die Funktion GetExitCodeProcess lieferte einen Fehler zurück. Ist dem nicht so, dann enthält Result den ExitCode des Kind-Prozesses. Zum Beispiel wird bei den Kommandozeilen-Versionen von Virenscannern ein ExitCode <> 0 zurückgeliefert wenn die zu scannende Datei einen Virus enthält.

Gast 14. Jun 2002 09:50

Danke jbg, 8)

trotzdem... bin ich vielleicht zu blöd...für diese Funktion...?

Vielleicht könnte mir jemand zeigen wie ich diese Funktion im Programm benutzen kann um eine beliebige EXE- Datei zu starten...

nach mehreren Versuchen...kann ich nur sagen: FIASSKO

bewegt sich überhaupt nichts...

diese cmdShow... was für ein Wert sollte ich hier übergeben..

Hilfe!!! :shock:

Gruß

Paul Jr.

jbg 14. Jun 2002 10:04

Code:
var ChildExitCode: Cardinal;
begin
  ChildExitCode := WinExec32AndWait('"Lw:\Path\File.exe" Parameters', SW_NORMAL);
  if Integer(ChildExitCode) = -1 then
    ShowMessage('Das Programm konnte nicht gestartet werden.');
end;
Kontretisiert:
Code:
var ChildExitCode: Cardinal;
begin
  ChildExitCode := WinExec32AndWait('"C:\Program Files\Borland\Delphi6\Bin\Delphi32.exe"', SW_NORMAL);
  if ChildExitCode = $FFFFFFFF then
     ShowMessage('Delphi 6 konnte nicht gestartet werden.');
end;
Code:
var ChildExitCode: Cardinal;
begin
  ChildExitCode := WinExec32AndWait('"C:\Program Files\Borland\Delphi6\Bin\Delphi32.exe" C:\MyFiles\Project1.dpr', SW_NORMAL);
  if ChildExitCode = $FFFFFFFF then
     ShowMessage('Delphi 6 konnte nicht gestartet werden und somit auch nicht die Datei C:\MyFiles\Project1.dpr öffnen.');
end;
Ich hoffe, dass das dir etwas hilft.

Gast 14. Jun 2002 10:15

Hallo jbg, :D

Du bist ein Teufelskerl...

Es kappt hervorragend...

Besten Dank an Dich und natürlich an Mathias :D für die tolle Funktion...

Gruß

Paul Jr.

MathiasSimmack 14. Jun 2002 13:09

Du kannst auch die Konstanten von Windows benutzen. Ich teste z.B., ob die Installation des MSI erforderlich ist, und der macht ja (unter Win98) danach meist einen Reboot:
Code:
if(WinExec32AndWait('MsiInstA.exe',SW_SHOWNORMAL) = ERROR_SUCCESS_REBOOT_REQUIRED) then
  // führ noch schnell was aus, dann reboote!
usw.

Die anderen Konstanten sollten in der Hilfe stehen. Oder im PSDK, Stichwort "System Error Codes".

poy 10. Feb 2003 14:20

gibt es auch eine solche methode wenn ich nicht winexec benutzte sondern shellexecute?

RomanK 10. Feb 2003 14:32

Hoi,
die Procedure heist lediglich WinExec... du kannst sie auch umbenenne. In ihr wird nicht WinExec sondern CreateProcess aufgerufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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