Einzelnen Beitrag anzeigen

sahmann

Registriert seit: 21. Jan 2003
15 Beiträge
 
#1

ShellExecute (und die Function RunProcess von Luckie)

  Alt 22. Jan 2003, 11:07
Hallo zusammen,

Ich zitiere hier Luckie aus einem Post vom Oktober
"Laut PSDK dient Shellexecute nicht dazu eine fremde Anwendung zu starten, sondern
Zitat:

Performs an operation on a specified file

.
Also um zum Beispiel eine Textdatei zu drucken ruft man Shellexecute mit dem Verb 'print' und der entsprechenden Datei auf. Das man damit auch fremde Anwendungen starten kann ist ein Abfallprodukt und ist eher als Mißbrauch zu sehen.

Wenn man es richtig machen will, sollte man CreateProcess benutzen.

Ich habe dazu mal eine kleine Funktion gebastelt. Der Funktion übergibt man den Pfad mit der Anwendung, ein Flag, welcher bestimmt, ob gewartet werden soll oder nicht bis die gestartetet Anwendung beendet ist und eine Variable vom Typ Cardinal, die dann die ProzessID enthält."

Ich habe mir den Source kopiert und bei mir eingebaut. Zum Scenario:
Ich habe ein Programm, welches als eine Art Installationsmenue dient. Das heisst, da sind vereinfacht ausgedrueckt 10 Buttons, und jeder Button ist mit einem RunProcess belegt, der ein externen Programm aufruft.

Problem dabei ist nun, das der erste Aufruf tadellos funktioniert, und die Applikation auch wartet (wait := true) bis das Setupprogramm
beendet und fertig ist.
Wenn man dann allerdings den naechsten Button klickt (oder wieder den Gleichen), dann startet das externe Setup nicht mehr. Im Taskmanager kann man dann nur noch die "setup.exe" und die "wowexec" abschiessen. Die Function RunProcess bekommt dann ein Signal das die Wartezeit abgelaufen ist, und man kann weiter arbeiten. Es lassen sich dann allerdings keine weiteren externen Programme starten.

Hat da noch jemand eine Idee? Hier ein Beispiel wie ich die Function RunProcess anspreche (man findet die Funktion wenn man hier im Forum nach "RunProcess" sucht.. ist von Luckie erstellt).


Code:
procedure TForm1.JvBitBtn1Click(Sender: TObject);
var
  wahl: integer;
  ProcID: PCardinal;

begin
  if not ListBox1.ItemIndex < 0 then begin
    wahl:= ListBox1.ItemIndex;
    if wahl = 11 then begin
MessageDlg('Das externe Programm wird jetzt gestartet',                mtInformation, [mbOk], 0);
  RunProcess('c:\daten\extern\setup.exe', SW_SHOWNORMAL, TRUE, ProcID);
  end;
end;
(sorry.. ich glaube die Formatierung spielt nicht ganz mit :/)

Für jede Hilfe sehr dankbar.

Gruss,
Sascha
  Mit Zitat antworten Zitat