Die Community zu .NET und Classic VB.
Menü

Eigene Extensionen

 von 

Ü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

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

Als Standardwert für diesen neuen Schlüssel nehmen Sie "xscfile". Es ist jeder beliebige Name möglich, jedoch sollte er aussagekräftig und selbsterklärend sein.

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.