Home » Tipps & Tricks » Dateien/Verzeichnisse » Dateioperationen » Datei mit zugeordneter Anwendung öffnen

Datei mit zugeordneter Anwendung öffnen

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;

Ein Gedanke zu „Datei mit zugeordneter Anwendung öffnen“

  1. Shellexecute arbeitete nicht genauso, wie ein Doppelklick im Explorer.
    Getestet mit Acrobat-Reader:
    – Doppelklick öffnet die Datei
    – Shellexecute nicht, aber Acrobat ist im Taskmanager gestartet (Doppelklick tuts nun nicht mehr, bis Prozess abgeschossen wird).
    Nimmt man in Acrobat den geschützten Modus raus, dann klappt beides.
    Doppelklick übersteuert den Modus also, Shellexecute nicht.

    Braucht Shellexecute noch einen Parameter, um wie der Doppelklick zu funktionieren?
    Oder gibt es einen Alternativbefehl (winexec tuts auch nicht)?

Kommentare sind geschlossen.