DruckenMister WongFacebook

Datei mit zugeordneter Anwendung öffnen

System Win9x, WinNT, Win2000, WinXP, Vista, Win7
Ab Delphi-Version Delphi 1
Letzte Änderung 27.04.2011

Mit ShellExecute können Dateien geöffnet werden. Dabei wird die Anwendung verwendet, die mit dem jeweiligen Dateityp verknüpft ist. Das Öffnen einer Datei mit der Endung *.doc öffnet z.B. Word. Es passiert also das gleiche wie bei einem Doppelklick auf eine Datei im Explorer. ShellExecute ist auch in der Lage, Verknüpfungen auszuführen (*.lnk). Und natürlich funktioniert das auch mit Dateien, die sich selbst ausführen können (*.exe).

Hier ein Beispiel:

uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ShellExecute(Application.Handle,
                 'open',
                 PChar('C:\meintext.doc'),
                 nil, nil, SW_NORMAL) <= 32 then
    ShowMessage('Es ist ein Fehler aufgetreten');
end;

Um ShellExecute aufzurufen, muss die Unit ShellApi der Uses-Klausel hinzugefügt werden.

ShellExecute benötigt eine Reihe an Parametern. In obigem Beispiel ist zu sehen, dass die Datei "meintext.doc" geöffnet werden soll. Die Parameter bedeuten dabei folgendes:

  • Handle des Eigentümerfensters (im Beispiel: Application.Handle): Dieses Fenster ist dafür zuständig, evtl. Fehlermeldungen anzuzeigen. Der Wert kann auch nil sein.
  • Aktion (im Beispiel: 'open'): Hier muss einer dieser Strings angegeben werden: edit, explore, find, open, print. Was bei der jeweiligen Aktion passiert, bestimmt die verknüpfte Anwendung. "open" funktioniert immer.
  • Dateiname (im Beispiel: PChar('C:\meintext.doc')): Der Dateiname - mit Pfad - der Datei, auf der obige Aktion ausgeführt werden soll. Da es sich bei ShellExecute um eine Windows-interne Funktion handelt, muss der String als nullterminierter String übergeben werden. Das erreicht man z.B. durch das Casten nach PChar, wie im Beispiel zu sehen.
  • Aufrufparameter (im Beispiel: nil): Hier kann ein String mit Parametern mitgegeben, die bei der Ausführung verwendet werden sollen.
  • Arbeitsverzeichnis (im Beispiel: nil): Angabe eines Arbeitsverzeichnisses, von dem aus die obige Datei ausgeführt werden soll. Es muss sich um einen absoluten Pfad handeln. Ist der Wert nil, wird das aktuelle Arbeitsverzeichnis verwendet.
  • Anzeigeform des Fensters (im Beispiel: SW_NORMAL): Konstante, die angibt, in welcher Größe das Anwendungsfenster angezeigt werden soll (Beispielwerte: SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL)

ShellExecute hat außerdem einen Rückgabewert, der genau beschreibt, ob alles funktioniert hat. Im Beispiel prüfen wir auf <=32, weil die Fehlercodes alle kleiner oder gleich 32 sind. Mit Hilfe folgender Funktion kann ein passender Fehlertext ausgegeben werden:

function ShellExecuteErrMessage(int_Code: INTEGER): string;
//Gibt die passenede Fehlermeldung zum ShellExecute Fehlercode zurück
begin
  case int_code of
     0: result := 'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte '+
                  'waren ungültig';
     2: result := 'Datei wurde nicht gefunden.';
     3: result := 'Verzeichnis wurde nicht gefunden.';
     5: result := 'Fehler beim gemeinsamen Zugriff auf eine Datei im Netz oder Fehler '+
                  'beim Zugriff auf eine gesperrte Datei im Netz.';
     6: result := 'Bibliothek forderte separate Datensegmente für jede Task an.';
     8: result := 'Zuwenig Speicher, um die Anwendung zu starten.';
    10: result := 'Falsche Windows-Version.';
    11: result := 'Ungültige ausführbare Datei. Entweder keine Windows-Anwendung oder '+
                  'Fehler in der EXE-Datei.';
    12: result := 'Anwendung für ein anderes Betriebssystem.';
    13: result := 'Anwendung für MS-DOS 4.0.';
    14: result := 'Typ der ausführbaren Datei unbekannt.';
    15: result := 'Versuch, eine Real-Mode-Anwendung (für eine frühere Windows-Version) '+
                  'zu laden.';
    16: result := 'Versuch, eine zweite Instanz einer ausführbaren Datei mit mehreren '+
                  'Datensegmenten die nicht als nur lesbar gekennzeichnet waren, zu laden.';
    19: result := 'Versuch, eine komprimierte ausführbare Datei zu laden.' + #13 +
                  'Die Datei muss dekomprimiert werden, bevor sie geladen werden kann.';
    20: result := 'Ungültige dynamische Linkbibliothek (DLL).' + #13 + 'Eine der DLLs, '+
                  'die benötigt wurde, um die Anwendung auszuführen, war beschädigt.';
  else
    result := 'Ein Unbekannter Fehler ist aufgetreten. (' + IntToStr(int_code) + ')';
  end;
end;