User Tools

Site Tools


vba:functions:fileinfos

[VBA] getFileTypeCommand(), getFileTypeDescription()

Im Tutorals-Forum kam von DrMueller die folgende Frage.

DrMueller:
Wir haben die Dokumenterstellung so programmiert, dass wir die Endung prüfen und entsprechend das Programm initialisieren …. Ich will nicht direkt öffnen, ich muss nur wissen, mit welchem Programm die Datei standardmässig geöffnet werden soll.

Soweit so gut. Zum direkt öffnen habe ich relativ schnell etwas gefunden. Aus Visual Basic heraus Dokumente in zugehörigen Anwendungen öffnen Doch nur das Programm auslesen ist nicht ganz so einfach. Nachdem Zvoni den Registry-Knoten lösen konnte, war eine Lösung nicht mehr weit.

Zvoni:
Wenn du mal beide Typen in der Class-Root (oder auch in HKLM) anschaust, dann siehst du bei “.jpg” als (Standard)-Wert “jpegfile”
Wenn du jetzt in der Registry in der Class-Root nach dem Schlüssel “jpegfile” suchst, landest du hier:
[HKEY_CLASSES_ROOT\jpegfile\shell\open\command]
Dasselbe bei “.dot”: Da steht Word.Template.8 (oder sowas) genau danach weitersuchen
HKEY_CLASSES_ROOT\Word.Template.8\shell\Open\command
und dort findest unter (Standard) das jeweilige Programm, mit dem es ausgeführt wird.

Darum hier diese 2 Funktionen. Die erste ermittelt den Programmstring, mit dem die Datei ausgeführt wird. Die 2te Funktion die Typenbeschreibung wie sie im Dateiexplorer angezeigt wird.

getFileTypeCommand()

getFileTypeCommand.bas
'/**
' * Gibt die "Befehlszeile" aus, mit der die Datei geöffnet wird
' * @example    debug.print getFileTypeCommand("help.chm")
' *             -> "C:\Windows\hh.exe" %1
' * @param  String      Dateiname/Dateipfad
' * @return String      Pfad mit der die Datei geöffnet wird
' */
Public Function getFileTypeCommand(ByVal iFileName As String) As String
	Dim objReg      As Object
	Dim extension   As String
	Dim key         As String
	Dim fso         As New FileSystemObject
	Const HKEY_CLASSES_ROOT = &H80000000
 
	'Dateiendung auslesen
	extension = fso.GetExtensionName(iFileName)
 
	'Registry-Objekt anlegen
	Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
	'Key auslesen
	objReg.GetStringValue HKEY_CLASSES_ROOT, "." & extension, , key
 
	'Aufruf ausgeben
	key = key & "\shell\Open\command"
	objReg.GetStringValue HKEY_CLASSES_ROOT, key, , getFileTypeCommand
 
	'Registry-Objekt zerstören
	Set objReg = Nothing
	Set fso = Nothing
End Function

getFileTypeDescription()

getFileTypeDescription.bas
'/**
' * Gibt die Programmbeschreibung der Datei aus
' * @example    debug.print getFileTypeDescription("help.chm")
' *             -> Compiled HTML Help file
' * @param  String      Dateiname/Dateipfad
' * @return String      Beschreibung
' */
Public Function getFileTypeDescription(ByVal iFileName As String) As String
	Dim objReg      As Object
	Dim extension   As String
	Dim key         As String
	Dim fso         As New FileSystemObject
	Const HKEY_CLASSES_ROOT = &H80000000
 
	'Dateiendung auslesen
	extension = fso.GetExtensionName(iFileName)
 
	'Registry-Objekt anlegen
	Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
	'Key auslesen
	objReg.GetStringValue HKEY_CLASSES_ROOT, "." & extension, , key
 
	'Aufruf ausgeben
	objReg.GetStringValue HKEY_CLASSES_ROOT, key, , getFileTypeDescription
 
	'Registry-Objekt zerstören
	Set objReg = Nothing
	Set fso = Nothing
End Function
vba/functions/fileinfos.txt · Last modified: 09.12.2013 09:39:54 (external edit)