Eigene Extensionen
von Elmar Steinböck
Übersicht
Viele Programmierer wollen auch eigene Dateiextensionen erstellen und verwalten. Dazu muss der betreffende Dateityp registriert werden. Dieses Tutorial behandelt aber nicht nur eigene Extensionen, sondern zeigt auch, wie schon bestehende Dateien (beispielsweise Bitmaps *.bmp) an eigene Programme übergeben und ausgewertet werden.
Update: Kontextmenü im Explorer - Eintrag "NEU"
Mit freundlichen Grüßen
Elmar Steinböck elmar@activevb.de
Vorwort
Das Erstellen und Registrieren eigener Dateitypen bzw. -extensionen ist im Prinzip sehr einfach. Wie bei allen Registrymanipulationen sollten Sie vorher ein Backup der Registry erstellen.
Sie können jede beliebige Datei mit ihrem Programm verknüpfen - Voraussetzung ist allerdings, dass ihr Programm die übergebenen Parameter auch umsetzen kann.
Wenn Sie einer Bitmap-Datei (*.bmp) in der Registry ihr eigenes Programm zuweisen und damit sicherstellen, dass bei jedem Öffnen einer bmp-Datei ihre Anwendung gestartet wird, müssen Sie diese Datei öffnen können. Sinnvollerweise sollte ihr Programm in diesem Fall Bitmaps verändern und wieder speichern können.
Im nächsten Kapitel erfahren Sie zunächst mehr über die Registry.
Registry allgemein
Wenn Sie Ihre eigene Routine zum Auslesen und Schreiben von Werten aus der /in die Registry haben, können Sie dieses Kapitel überspringen.
Im Anhang finden Sie ein Beispielprojekt mit einem Modul, das nur die Registry betrifft. Sie können dieses Modul ebenso in anderen Anwendungen einsetzen.
Die Vorgangsweise für eigene Dateiextensionen zeigt folgender Ablauf:
1) Überprüfen, ob der betreffende Schlüssel und Wert bereits vorhanden ist.
2) Ist der Wert nicht mehr vorhanden, weil ihn der User oder ein anderes Programm gelöscht haben, muss die Registrierung erneut erfolgen.
3) Übergabe der gewünschten Datei an ihr Programm per Command().
Registry speziell
Ich will Ihnen anhand eines Beispiels die zuständigen Schlüssel näher bringen:
Eigene Dateiextension
Wir nehmen an, dass unsere "eigenen" Dateien die Endung "ffg" haben. Obwohl es Windowsstandard ist, nur Extensionen mit drei Zeichen zu verwenden, gibt es mittlerweile auch Dateien mit mehr Zeichen. Versuchen Sie eine "einmalige" Extension zu schaffen. Die Dateitypen BMP oder GIF gibt es bereits; wenn Sie Textdateien bearbeiten wollen, werden Sie mit bmp-Dateien arge Schwierigkeiten bekommen ;-)
Registry-Schlüssel:
Zuständig für unseren neuen Dateityp "xsc" ist der Schlüssel:
HKEY_CLASSES_ROOT
In diesem Registryzweig wird nun ein neuer Schlüssel mit dem Namen ".xsc" erstellt.
Abbildung 1: Screenshot des Registryeditors
Hinweis
Betrachten Sie einmal die bestehenden Schlüssel im Zweig HKEY_CLASSES_ROOT. Sie finden dort alle registrierten Dateitypen.
Als nächster Schritt muss die Bezeichnung für unsere Datei "xscfile" registriert werden. Dazu wird einfach ein neuer Schlüssel angelegt. Der neue Schlüssel sieht dann so aus:
HKEY_CLASSES_ROOT\xscfile
Unterschlüssel
Nun sind noch einige wenige Schritte erforderlich. Es müssen noch drei Schlüssel erstellt werden. Für den Schlüssel "xscfile" erstellen wir den Schlüssel "shell", für diesen den Schlüssel "open" und dann noch den Schlüssel "command". Erst für den Schlüssel "command" wird ein bestimmter Wert festgelegt.
Es ist der komplette Pfad zu Ihrer Anwendung (zB C:\Programme\MeinProgramm.exe).
Achten Sie darauf, diesen Wert in Anführungszeichen zu setzen. Der Eintrag für "Standard" sieht so aus: "C:\Programme\MeinProgramm.exe" %1
Abbildung 2: Screenshot des Registryeditors
Vergessen Sie nicht die Zeichenfolge "%1" anzugeben.
Eintrag im Kontextmenü des Explorers:
Wollen Sie Ihr Programm vom Kontextmenü aufrufen, gehen Sie so vor:
Abbildung 3: Kontextmenü des Explorers
Zuständig ist der undokumentierte Eintrag "ShellNew" im Zweig "HKEY_CLASSES_ROOT".
In unserem Beispiel wurde unter HKEY_CLASSES_ROOT der Eintrag ".xsc" gesetzt. Für das Kontextmenü brauchen Sie einen neuen Unterschlüssel: HKEY_CLASSES_ROOT\.xsc\ShellNew und einen neuen Eintrag: "NullFile"
Dim a As Long, b As Long, c As Long, d As Long Dim bb As Long, cc As Long, ee As Long, ff As Long Dim XscWert As String XscWert = "xscfile" ' Anlegen einer neuen Extension: a = CreateKey(HKEY_CLASSES_ROOT, ".xsc", "") ' Beschreibung unserer Datei: b = SetValue(HKEY_CLASSES_ROOT, ".xsc", "", XscWert) ' Aufnahme ins Kontextmenü: bb = CreateKey(HKEY_CLASSES_ROOT, ".xsc\ShellNew", "") cc = SetValue(HKEY_CLASSES_ROOT, ".xsc\ShellNew", "NullFile", "") ' Anlegen der Dateibezeichnung: ee = CreateKey(HKEY_CLASSES_ROOT, "xscfile", "") ff = SetValue(HKEY_CLASSES_ROOT, "xscfile", "", "XSC-Files") ' Anlegen von ShellNew, um dem Eintrag unsere EXE ' zu übergeben: c = CreateKey(HKEY_CLASSES_ROOT, "xscfile\shell\open\command", "") d = SetValue(HKEY_CLASSES_ROOT, "xscfile\shell\open\command", "", Pfad)
Command()
Die Visual-Basic-Funktion "Command ()" ist für die Parameterübergabe verantwortlich. Dieser Funktion wird einfach ein Stringwert übergeben, in unserem Fall der gesamte Pfad der zu öffnenden Datei.
Binden Sie diese Funktion in das Ereignis "Form_Load" Ihrer Anwendung ein:
Dim cmdline
cmdline = Command()
RichTextBox1.LoadFile cmdline
Wie funktioniert es ?
Der zu bearbeitende (oder zu öffnende) Dateityp mit der Extension "xsc" wurde in der Registry gespeichert. Wenn diese Datei geöffnet wird (Doppelklick, einfacher Klick je nach Einstellung), wird das in der Registry festgelegte Programm gestartet. Mit der Befehlszeile Command() wird nun an unser Programm übergeben, von wo es aufgerufen wurde. Praktisch der gesamte Pfad.
Anmerkung:
Sie können auch andere Parameter übergeben, wie es zu DOS-Zeiten üblich war. Legen Sie beispielsweise fest, dass mit "C:\meinProgramm.exe A " das Formular "frmMain" gestartet werden soll und mit "C:\meinProgramm.exe B " das Formular "frmAbout", dann wird der Code so realisiert:
Sub Main() Dim cmdLine As String cmdLine = Command() Select Case cmdLine Case "A" frmMain.Show Case "B" frmabout.Show Case Else frmMain.Show MsgBox "Fehler im System" End Select End Sub
Der Aufruf erfolgte in diesem Fall von einem Modul heraus (Sub Main).
Mehrere Dateitypen
Größere Programme wie Paint Shop Pro bieten dem Anwender die Möglichkeit, nur bestimmte Dateien mit ihrem Programm zu verknüpfen. Sie können also den User wählen lassen, welche Dateien mit Ihrer Anwendung geöffnet werden:
Abbildung 4: Auswahl verschiedener Dateitypen
Beispielprojekt
Anhand eines Beispiels (welches Sie auch im Anhang finden), will ich den Ablauf noch einmal erläutern:
Zuerst ist es wichtig, den Dateityp zu registrieren. Dies geschieht im Ereignis Form_Load. Optional können Sie die Einstellungen auch in ein anderes Formular auslagern (siehe FileAssociations bei Paint Shop Pro).
Private Sub Form_Load() On Error Resume Next Call Settings Call RegistryCheck Dim cmdLine cmdLine = Command() RichTextBox1.LoadFile cmdLine Me.Caption = "X-SCR - " & cmdLine End Sub
Im Ereignis Form_Load wird der gewünschte Parameter übergeben und in diesem Fall an eine Richtextbox übergeben. Stimmt der Dateityp nicht, weil es sich zB um eine *.wav-Datei handelt, bekommen Sie einen Laufzeitfehler !
Natürlich sollte überprüft werden, ob der Schlüssel überhaupt noch existiert. Andernfalls werden Ihre Dateien nie mit Ihrem Programm geöffnet...
Diese Überprüfung wurde in die Funktion "RegistryCheck" ausgelagert.
Sub RegistryCheck() 'Auslesen der Registrierung, ob Eintrag 'HKEY_CLASSES_ROOT schon vorhanden (*.xsc) 'Wenn nicht (gelöscht oder erster Start) 'Schlüssel setzen, um Dateityp zu registrieren On Error Resume Next Dim Datei As String Dim Datei2 As String Dim Pfad As String Pfad = App.Path & "\" & App.Title & ".exe" Pfad = Chr(34) & Pfad & Chr(34) & " %1" Datei = ".xsc" Datei2 = ".xscfile" If GetValue(HKEY_CLASSES_ROOT, "xscfile\shell\open\command", _ "", Pfad) Then Exit Sub Else Dim a&, b&, c&, d& Dim XscWert As String XscWert = "xscfile" a = CreateKey(HKEY_CLASSES_ROOT, _ ".xsc", "") b = SetValue(HKEY_CLASSES_ROOT, _ ".xsc", "", XscWert) c = CreateKey(HKEY_CLASSES_ROOT, _ "xscfile\shell\open\command", "") d = SetValue(HKEY_CLASSES_ROOT, _ "xscfile\shell\open\command", "", Pfad) End If End Sub
Wichtig sind die Anführungszeichen im String ( Chr(34) ).
Zusammenfassung
Dieses Tutorial sollte Ihnen nur einen Grundstock geben. Natürlich ist das Beispiel noch ausbaufähig. Es wurde zB nicht überprüft, ob der Pfad in der Registry noch stimmt. Falls Ihr Programm verschoben wird, stimmt auch die Verknüpfung in der Registry nicht mehr. Eine Verbesserung sollte jedoch kein Problem darstellen, zumal Sie im Anhang ein sehr gutes Modul zur Manipulation der Registry finden.
Beispiel-Projekt als Download [7790 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.