AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Programm starten u. auf dessen Ende warten + Rückgabewert
Thema durchsuchen
Ansicht
Themen-Optionen

Programm starten u. auf dessen Ende warten + Rückgabewert

Ein Thema von Andreas L. · begonnen am 13. Jul 2009 · letzter Beitrag vom 27. Apr 2012
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Programm starten u. auf dessen Ende warten + Rückgabewert

  Alt 13. Jul 2009, 17:04
Manchmal ist es nötig von einem gestarteten Programm eine Antwort zu erhalten. Z. B. hat man ein Update-Programm und möchte wissen ob eine neue Version verfügbar ist oder das Update erfolgreich installiert wurde. Dazu kann man den ExitCode der Anwendung setzen. ExitCode ist eine Integer-Variable. Zur besseren Code-Lesbarkeit können wir uns noch einen eigenen Typen in den beiden Anwendungen definieren. Z. B.
Delphi-Quellcode:
  type
    TUpdateResult = (urSuccessful, urError);
In der zu startenden Anwendung (Update.exe) einfach im z. B. OnClose des MainForms oder nach ausführen einer Aktion:
Delphi-Quellcode:
  //globale Variable
  var
    MyUpdateResult: TUpdateResult;

...
...
  //Bsp.: Eine Datei kopieren und bei Erfolg den Wert
  //urSuccessful unserer globalen Variable zuweisen
  if CopyFile('Datei.exe', 'Datei.exe', False) then
    MyUpdateResult := urSuccessful
  else
    MyUpdateResult := urError;

...
...
  //Den Wert aus unserer Variable nach Integer casten und in die Variable ExitCode eintragen
  ExitCode := Integer(MyUpdateResult);
In der Hauptanwendung welche das Update z. B. bei einem ButtonClick startet, müssen wir uns nur noch TShellExecuteInfo, ShellExecuteEx, GetExitCodeProcess und WaitForSingleObject bedienen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   ExecuteInfo: TShellExecuteInfo;
   UpdateResult: TUpdateResult;
   Temp: Integer;
begin
  //Einstellungen setzen
  FillChar(ExecuteInfo, SizeOf(ExecuteInfo), 0);
  ExecuteInfo.cbSize := SizeOf(TShellExecuteInfo);
  with ExecuteInfo do
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    wnd := Application.Handle;

    //Auszuführende Anwendung
    lpFile := PChar('Update.exe');

    //auf Wunsch noch Parameter mitgeben
    //lpParameters := PChar('-EinParameter');

    //Wenn Update.exe im selben Verzeichnis wie die Hauptanwendung liegt, ansonsten anpassen!
    lpDirectory := PChar(ExtractFilePath(Application.ExeName));

    //Update.exe anzeigen, weitere Möglichkeiten SW_HIDE oder SW_MAXIMIZED, etc.
    nShow := SW_SHOWNORMAL;
  end;

  //Anwendung starten
  if not ShellExecuteEx(@ExecuteInfo) then
    RaiseLastOSError;

  //Warten bis Update.exe beendet wird, anstatt INFINITE kann man auch eine
  //Wartezeit in Milisekunden übergeben z. B. 120000 für 2 Min.
  WaitForSingleObject(ExecuteInfo.hProcess, INFINITE);

  //ExitCode holen
  GetExitCodeProcess(ExecuteInfo.hProcess, TempCode);

  //Handle schließen
  CloseHandle(ExecuteInfo.hProcess)

  //Nach TUpdateResult casten...
  UpdateResult := TUpdateResult(TempCode);

  //...und auswerten
  case UpdateResult of
    urError: ShowMessage('Es ist ein unbekannter Fehler aufgetreten!'); //Wie ich diese Fehlermeldung liebe ;-)
    urSuccessful: ShowMessage('Update wurde installiert :-)');
  end;

end;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:09
Da leckt ein Handle. CloseHandle(ExecuteInfo.hProcess) fehlt. Außerdem sollte man die Rückgabewerte auswerten und ggf. eine passende Exception werfen. Daneben ist es Konvention, dass der ExitCode Null für Erfolg und alles andere für einen Fehler steht; bei dir ist es andersherum.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:31
Zitat von Apollonius:
Da leckt ein Handle. CloseHandle(ExecuteInfo.hProcess) fehlt. ... Daneben ist es Konvention, dass der ExitCode Null für Erfolg und alles andere für einen Fehler steht; bei dir ist es andersherum.
Habs geändert, danke für den Hinweis

Zitat:
Außerdem sollte man die Rückgabewerte auswerten und ggf. eine passende Exception werfen.
Wo genau bzw. welche Rückgabewerte soll ich auswerten?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:38
Insbesondere bei ShellExecuteEx solltest du auf Fehler prüfen. Sonst kann eigentlich nicht viel schiefgehen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:44
Zitat von Apollonius:
Insbesondere bei ShellExecuteEx solltest du auf Fehler prüfen. Sonst kann eigentlich nicht viel schiefgehen.
Bin mir nicht sicher welche Exception ich auslösen soll, wie wärs damit:

Delphi-Quellcode:
  //Anwendung starten
  if not ShellExecuteEx(@ExecuteInfo) then
    raise Exception.Create('ERROR:' + IntToStr(GetLastError));
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:51
Du kannst einfach die Routine RaiseLastOSError verwenden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#7

Re: Programm starten u. auf dessen Ende warten + Rückgabewer

  Alt 13. Jul 2009, 17:53
Zitat von Apollonius:
Du kannst einfach die Routine RaiseLastOSError verwenden.
Klar, hätt' ich auch selber drauf kommen müssen

Habs eingebaut 8)
  Mit Zitat antworten Zitat
nachtstreuner

Registriert seit: 21. Aug 2005
Ort: ESA
104 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Programm starten u. auf dessen Ende warten + Rückgabewert

  Alt 27. Apr 2012, 09:45
Hallo Andreas, hallo Apollonius,

vielen Dank für Eure Beiträge. Die Erklärungen tragen leider nichts zur Lösung meines Problems bei, sind aber sehr interessant und im Code mit Sicherheit zu berücksichtigen. Werde ich auch testen.

Nach langem Probieren, warum die Packliste(@backup.lst) nicht ausgelesen wurde, habe ich nun die vermeintliche Lösung gefunden.

Ich mache noch ein paar Tests in Bezug auf Leerzeichen, Sonderzeichen in Dateinamen und werde das Ergebnis posten bzw.
wenn gewünscht werde ich versuchen, wenn nun alles sauber funktioniert ein aussagekräftiges Tut. zu schreiben, für alle die sich mit den Kommandozeilen in der RAR.exe herumschlagen wollen.

Beim jetzigen Test, werden sowohl ganze Ordner mit Unterordner , sowie Dateien mit RAR aus Delphi heraus gepackt. Wunschweise auch mit Ursprungspfad oder auch Ohne (siehe param -ep1).

Wie gesagt ich melde mich gleich wieder.

Gruß nachtstreuner
Alles wird gut -
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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