[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Delphi 3 ExecuteFile



Am Fri, 20 Aug 1999 08:50:17 +0200, schriebst Du:

> ich suche eine Alternative zu ExecuteFile in DELPHI 3.
> Die Alternative sollte die Kontrolle an das aufrufende Programm erst dann
> zurueckgeben, wenn das gestartete Programm beendet ist.

Aus einer der vielen FAQ zu Delphi habe ich nachfolgendes kopiert, es
aber selbst noch nicht ausprobiert.

Falls Du Delphi einsteiger bist, kann ich Dir sowohl die
Addison-Wesley-Buecher (gibt es fuer Blinde auch auf CD im Textformat)
als auch die Newsgroup de.comp.lang.pascal.delphi empfehlen, die genau
solche Fragen immer wieder behandelt.

-----
Das de.comp.lang.pascal.delphi FAQ
Die neuste und vollstaendige Version dieses Textes gibt es immer unter
http://www.diamond-pro.com/delphi/faq.txt

3.4 Wie kann ich ein anderes Programm starten? Wie kann ich eine Datei
mit  der dafuer registrierten Anwendung starten?

 Die Online-Hilfe verweist in diesem Fall auf die Funktion
ExecuteFile(),
 diese ist in der Datei \doc\FileManEx\FMXUtils.pas enthalten.

 ExecuteFile sucht sich anhand der Dateiendung die passende Anwendung,
 das klappt sogar hiermit:
  ExecuteFile('http://www.yahoo.com/index.html','','',0);
 da ExecuteFile anhand der Endung '.html' den standard Webbrowser
oeffnet.

 Eine andere Moeglichkeit ist die Funktion ShellExecute aus der WinAPI,
mit  der man auch drucken oder Mails versenden kann:
  ShellExecute(Application.MainForm.Handle, 'open', <Programmdatei>,
<Aufrufparameter>,'', SW_SHOWNORMAL);
 genaueres zu ShellExecute steht in der Online-Hilfe

3.5 Wie kann ich ein anderes Programm starten und auf dessen Ende
warten?

 Um auf das gestartete Programm warten zu koennen, muss man den Prozess
 'von Hand' starten:

  var StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;

  begin

    FillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb := Sizeof(StartupInfo);  
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := swShow;

    if CreateProcess(nil,
      command,                       { pointer to command line string
(PChar!)}
      nil,                           { pointer to process security
attributes }
      nil,                           { pointer to thread security
attributes }
      false,                         { handle inheritance flag }
      CREATE_NEW_CONSOLE or          { creation flags }
      NORMAL_PRIORITY_CLASS,
      nil,                           { pointer to new environment
block }
      nil,                           { pointer to current directory
name }
      StartupInfo,                   { pointer to STARTUPINFO }
      ProcessInfo)                   { pointer to PROCESS_INF }
    then begin
      WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Result);
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(ProcessInfo.hProcess);
    end;
  end;

---- ENDE DES TEILES DER FAQ ----

Hoffe das hilft

Ansonsten in der oben genannten Newsgroup nachfragen.

Gruss
Guenter Hanke


-----
Guenter Hanke
D-68794 Oberhausen-Rhsn., Germany
Beruf: g.hanke_bEi_audiodata.de   Tel: +49 7254 9360-19
Privat: guenter.hanke_bEi_inka.de Tel: +49 7254 60991
private Homepage: http://sites.inka.de/hghpc