Tipp 5.16 - Systemordner ermitteln
Wie kann ich einen spezielle Systemordner ermitteln?
Mit dieser Funktion können Sie einen spezielle Systemordner ermitteln. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.
Verwendete Win32-Api-Aufrufe und Typen: CoTaskMemFree, SHGetSpecialFolderLocation, SHGetPathFromIDList, GetVersionEx - OSVERSIONINFO
Beispiel:
Option Explicit Public Enum CSIDL_FLAGS CSIDL_DESKTOP = &H0 ' (Desktop) CSIDL_INTERNET = &H1 ' Internet Explorer (Desktop) CSIDL_PROGRAMS = &H2 ' Startmenü\Programme CSIDL_CONTROLS = &H3 ' Arbeitsplatz\Systemsteuerung CSIDL_PRINTERS = &H4 ' Arbeitsplatz\Drucker CSIDL_PERSONAL = &H5 ' Eigene Dateien CSIDL_FAVORITES = &H6 ' (Benutzername(BN))\Favoriten CSIDL_STARTUP = &H7 ' Startmenü\Programme\Autostart CSIDL_RECENT = &H8 ' (BN)\Recent CSIDL_SENDTO = &H9 ' (BN)\SendTo CSIDL_BITBUCKET = &HA ' (Desktop)\Papierkorb CSIDL_STARTMENU = &HB ' (BN)\Startmenü CSIDL_DESKTOPDIRECTORY = &H10 ' (BN)\Desktop CSIDL_DRIVES = &H11 ' Arbeitsplatz CSIDL_NETWORK = &H12 ' Netzwerkumgebung CSIDL_NETHOOD = &H13 ' (BN)\Netzwerk(umgebung) CSIDL_FONTS = &H14 ' Windows\Fonts CSIDL_TEMPLATES = &H15 ' (BN)\Vorlagen CSIDL_COMMON_STARTMENU = &H16 ' All Users\Startmenü CSIDL_COMMON_PROGRAMS = &H17 ' All Users\Programme CSIDL_COMMON_STARTUP = &H18 ' All Users\Autostart CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' All Users\Desktop CSIDL_APPDATA = &H1A ' (BN)\Anwendungsdaten CSIDL_PRINTHOOD = &H1B ' (BN)\Druckumgebung ' NT5! (BN)\Lokale Einstellungen\Anwendungsdaten CSIDL_LOCAL_APPDATA = &H1C ' (BN)\Lokale Einstellungen\Temporary Internet Files CSIDL_INTERNET_CACHE = &H20 CSIDL_COOKIES = &H21 ' (Benutername)\Cookies CSIDL_HISTORY = &H22 ' (BN)\Lokale Einstellungen\Verlauf ' NT5! All Users\Anwendungsdaten CSIDL_COMMON_APPDATA = &H23 CSIDL_WINDOWS = &H24 ' NT5! Windowsverzeichnis CSIDL_SYSTEM = &H25 ' NT5! Systemverzeichnis CSIDL_PROGRAM_FILES = &H26 ' NT5! C:\Programme ' NT5! (BN)\Eigene Dateien\Eigene Bilder CSIDL_MYPICTURES = &H27 CSIDL_PROFILE = &H28 ' NT5! (BN) ' NT5! C:\Programme\Gemeinsame Dateien CSIDL_PROGRAM_FILES_COMMON = &H2B CSIDL_COMMON_TEMPLATES = &H2D ' All Users\Vorlagen CSIDL_COMMON_DOCUMENTS = &H2E ' All Users\Dokumente ' NT5! All Users\Startmenü\Programme\Verwaltung CSIDL_COMMON_ADMINTOOLS = &H2F ' NT5! (BN)\Startmenü\Programme\Verwaltung CSIDL_ADMINTOOLS = &H30 End Enum Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformID As Long szCSDVersion As String * 128 End Type Public Declare Sub CoTaskMemFree _ Lib "OLE32.dll" (ByVal pv As Long) Public Declare Function GetActiveWindow _ Lib "user32" () As Long Public Declare Function SHGetSpecialFolderLocation _ Lib "shell32.dll" _ (ByVal hwndOwner As Long, _ ByVal nFolder As Long, pidl As Long) As Long Public Declare Function SHGetPathFromIDList _ Lib "shell32.dll" Alias _ "SHGetPathFromIDListA" _ (ByVal pidl As Long, _ ByVal pszPath As String) As Long Public Declare Function GetVersionEx _ Lib "kernel32" Alias _ "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Public Function GetSpecialFolder( _ lClsID As CSIDL_FLAGS) _ As String '// ----------------------------------------------------- '// Methode: | Ermittelt verschiedene Systemordner '// | Ob der gewünschte Ordner ermittelt '// | werden kann, hängt vom Betriebssystem ab '// ----------------------------------------------------- '// Parameter: | lClsID = Typ des gewünschten Ordners '// ----------------------------------------------------- '// Rückgabe: | bei Erfolg der gewünschte Ordner '// ----------------------------------------------------- '// Autor: | Stefan Kulpa '// | EDV Innovation & Consulting - Dormagen '// ----------------------------------------------------- Dim sPath As String Dim lPidl As Long Dim lMaxClsID As Long If IsWinNT5 Then 'erweiterte Funktionalität lMaxClsID = 48 Else: lMaxClsID = 34 End If If lClsID > lMaxClsID Then Exit Function If (Not IsWinNT5) And _ (lClsID = CSIDL_LOCAL_APPDATA) Then Exit Function If SHGetSpecialFolderLocation( _ GetActiveWindow, lClsID, lPidl) = 0 Then sPath = VBA.Space$(260) If SHGetPathFromIDList(ByVal lPidl, _ ByVal sPath) Then GetSpecialFolder = VBA.Left( _ sPath, VBA.InStr(sPath, vbNullChar) - 1) End If Call CoTaskMemFree(lPidl) End If End Function Public Property Get IsWinNT5() As Boolean Const VER_PLATFORM_WIN32_NT As Long = 2 Dim uOSVer As OSVERSIONINFO uOSVer.dwOSVersionInfoSize = Len(uOSVer) GetVersionEx uOSVer IsWinNT5 = (uOSVer.dwPlatformID = _ VER_PLATFORM_WIN32_NT) And _ (uOSVer.dwMajorVersion = 5) End Property