Wenn Sie im Windows-Explorer eine Datei doppelklicken, wird sie, sofern es sich um einen registrierten
Dateityp handelt, mit der zugehörigen Anwendung geöffnet. Beispielsweise ist die Dateiendung .txt standardmässig
mit dem Minimal-Editor notepad.exe verknüpft; ein Doppelklick auf eine Datei c:\test.txt führt also zu einem Aufruf
von notepad.exe, wobei der Pfad zur gewählten Datei als Kommandozeilenparamter übergeben wird, so als
ob Sie folgendes an der Kommandozeile eingegeben hätten:
nodepad.exe c:\test.txt. Vom aufgerufenen
Programm wird nun erwartet, dass es den Kommandozeilenparameter auswertet (in VB gibt es dafür die
Command$()-Funktion) und mit der übergebenen Datei entsprechend verfährt.
Die folgende Routine zeigt, wie Sie eine solche Dateitypen-Registrierung programmatisch mit VB vornehmen können.
Sie sorgt nicht nur für die Registrierung an sich, sondern auch dafür, dass
- das Icon der Anwendung registriert wird als das Icon, mit dem der Dateityp im Explorer dargestellt werden soll und
- das System über die Änderung informiert wird, so dass der Dateityp sofort mit dem entsprechenden Icon im Explorer dargestellt wird.
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
(ByVal HKEY As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" _
(ByVal HKEY As Long, ByVal lpSubKey As String, ByVal dwType As Long, _
ByVal lpData As String, ByVal cbData As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal HKEY As Long) As Long
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal HKEY As Long, ByVal lpSubKey As String) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal HKEY As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal HKEY As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Declare Sub SHChangeNotify Lib "Shell32.dll" (ByVal wEventId&, ByVal uFlags&, _
ByVal dwItem1 As Any, ByVal dwItem2 As Any)
Declare Function FindExecutable Lib "Shell32.dll" Alias _
"FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, _
ByVal lpResult As String) As Long
Const HKEY_CLASSES_ROOT As Long = &H80000000
Const REG_SZ As Long = 1
Const SHCNE_ASSOCCHANGED As Long = &H8000000
Function AssocFileType(ByVal Extension As String, _
ByVal Identifier As String, _
ByVal Description As String, _
ByVal ApplicationPath As String) As Boolean
Dim lphKey As Long, l As Long, s As String
If Left$(Extension, 1) <> "." Then
Extension = "." & Extension
End If
If RegCreateKey(HKEY_CLASSES_ROOT, Extension, lphKey) = 0 Then
If lphKey Then
If RegSetValue(lphKey, "", REG_SZ, Identifier, 0&) = 0 Then
l = RegCloseKey(lphKey)
l = RegCreateKey(HKEY_CLASSES_ROOT, Identifier, lphKey)
l = RegSetValue(lphKey, "", REG_SZ, Description, 0&)
s = ApplicationPath & " ""%1"""
l = RegSetValue(lphKey, "shell\open\command", REG_SZ, s, Len(s))
s = ""
l = RegSetValue(lphKey, "shell", REG_SZ, s, Len(s))
s = ApplicationPath & ",0"
l = RegSetValue(lphKey, "DefaultIcon", REG_SZ, s, Len(s))
SHChangeNotify SHCNE_ASSOCCHANGED, 0&, 0&, 0&
AssocFileType = True
End If
l = RegCloseKey(lphKey)
End If
End If
End Function
Die Funktion liefert
True zurück, wenn die Operation erfolgreich abgeschlossen wurde;
beachten Sie bitte, dass dazu ausreichende Schreibberechtigungen für den Registry-Zweig HKEY_CLASSES_ROOT erforderlich sind.
Ihr Programm sollte berücksichtigen, dass der übergebene Dateiname in Anführungszeichen eingeschlossen
übergeben wird, und diese ggfs. entfernen, bevor Sie den Dateinamen weiter verarbeiten:
Sub Main()
Dim s As String
s = Command$()
If Len(s) > 2 Then
If Left$(s, 1) = """" Then
If Right$(s, 1) = """" Then
s = Mid$(s, 2, Len(s) - 2)
End If
End If
End If
If Len(s) Then
If FileExists(s) Then
Open ...
End If
End If
End Sub
Bevor ein Dateityp assoziiert wird, sollte man prüfen, ob der Typ nicht schon einer anderen
Anwendung zugeordnet ist:
Public Function AppForFile(ByVal Datei As String) As String
Dim Pfad As String
Const MAX_PATH& = 256
Pfad = Space$(MAX_PATH)
FindExecutable Datei, vbNullString, Pfad
AppForFile = Left$(Pfad, InStr(Pfad, vbNullChar) - 1)
End Function
wenn ja, ist es guter Stil, wenigstens den Anwender zu fragen, ob das eigene Programm diesen
Dateityp übernehmen soll:
If LenB(AppForFile("MyFile.mfl")) = 0 Then
AssocFileType ".mfl", "mflfile", "Datei für mein Programm", App.Path & "\" & App.ExeName & ".exe"
End If
Zum Schluss noch eine Routine, mit der sie die Registrierung eines Dateityps wieder rückgängig machen können:
Function DeAssocFileType(ByVal Extension As String) As Boolean
Dim l As Long, lphKey As Long, lType As Long, lBufLen As Long
Dim sKeyName As String, sKeyValue As String, b() As Byte
If Left$(Extension, 1) <> "." Then
Extension = "." & Extension
End If
If RegOpenKeyEx(HKEY_CLASSES_ROOT, Extension, 0&, KEY_ALL_ACCESS, lphKey) = 0 Then
l = RegQueryValueEx(lphKey, "", 0&, lType, 0&, lBufLen)
If l = 0 And lType = REG_SZ Then
ReDim b(0 To lBufLen - 1)
l = RegQueryValueEx(lphKey, "", 0&, lType, VarPtr(b(0)), lBufLen)
sKeyValue = Left$(StrConv(b, vbUnicode), lBufLen - 1)
Else
RegCloseKey lphKey
Exit Function
End If
RegCloseKey lphKey
l = RegDeleteKey(HKEY_CLASSES_ROOT, Extension)
If RegDeleteKey(HKEY_CLASSES_ROOT, sKeyValue & "\shell\open\command") = 0 Then
If RegDeleteKey(HKEY_CLASSES_ROOT, sKeyValue & "\shell\open") = 0 Then
RegDeleteKey HKEY_CLASSES_ROOT, sKeyValue & "\shell"
End If
End If
If RegDeleteKey(HKEY_CLASSES_ROOT, sKeyValue & "\DefaultIcon") = 0 Then
RegDeleteKey HKEY_CLASSES_ROOT, sKeyValue
End If
SHChangeNotify SHCNE_ASSOCCHANGED, 0&, 0&, 0&
DeAssocFileType = True
End If
End Function