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.

Api-AufrufeVerwendete 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