Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0061: Windows-Verzeichnisse erfassen

 von 

Beschreibung 

Manchmal ist es sinnvoll die Position eines bestimmten Windows-Verzeichnisse zu erfahren, da diese nicht unbedingt auf jedem Rechner an der selben Stelle zu finden sind.

Update am 05.10.2016: Dieser Tipp wurde von Kai mithilfe des Tippuploads überarbeitet und ersetzt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CoTaskMemFree, GetTempFileNameA (GetTempFileName), GetTempPathA (GetTempPath), SHGetPathFromIDListA (SHGetPathFromIDList), SHGetSpecialFolderLocation

Download:

Download des Beispielprojektes [4.06 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Beschriftungsfeld "Label12"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label13"
' Steuerelement: Beschriftungsfeld "Label11"
' Steuerelement: Beschriftungsfeld "Label10"
' Steuerelement: Beschriftungsfeld "Label9"
' Steuerelement: Beschriftungsfeld "Label8"
' Steuerelement: Beschriftungsfeld "Label7"
' Steuerelement: Beschriftungsfeld "Label6"
' Steuerelement: Beschriftungsfeld "Label5"
' Steuerelement: Beschriftungsfeld "Label4"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label1"
' Steuerelement: Beschriftungsfeld "Label26"
' Steuerelement: Beschriftungsfeld "Label23"
' Steuerelement: Beschriftungsfeld "Label22"
' Steuerelement: Beschriftungsfeld "Label21"
' Steuerelement: Beschriftungsfeld "Label20"
' Steuerelement: Beschriftungsfeld "Label19"
' Steuerelement: Beschriftungsfeld "Label18"
' Steuerelement: Beschriftungsfeld "Label17"
' Steuerelement: Beschriftungsfeld "Label16"
' Steuerelement: Beschriftungsfeld "Label14"
' Steuerelement: Beschriftungsfeld "Label24"
' Steuerelement: Beschriftungsfeld "Label15"
' Steuerelement: Beschriftungsfeld "Label25"
Option Explicit

Private Sub Form_Load()
    Label1.Caption = GetShellFolder(CSIDL_DESKTOPDIRECTORY)
    Label2.Caption = GetShellFolder(CSIDL_STARTMENU)
    Label3.Caption = GetShellFolder(CSIDL_PROGRAM_FILES)
    Label4.Caption = GetShellFolder(CSIDL_PERSONAL)
    Label5.Caption = GetShellFolder(CSIDL_FAVORITES)
    Label6.Caption = GetShellFolder(CSIDL_COMMON_STARTUP)
    Label7.Caption = GetShellFolder(CSIDL_RECENT)
    Label8.Caption = GetShellFolder(CSIDL_SENDTO)
    Label9.Caption = GetShellFolder(CSIDL_TEMPLATES)
    Label10.Caption = GetShellFolder(CSIDL_NETWORK)
    Label11.Caption = GetShellFolder(CSIDL_FONTS)
    Label12.Caption = GetShellFolder(CSIDL_INTERNET_CACHE)
    
    Label13.Caption = GetTempFolder
End Sub




'---------- Ende Formular "Form1" alias Form1.frm  ----------
'---- Anfang Modul "modShellDirs" alias modShellDirs.bas ----
Option Explicit

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" ( _
    ByVal pIdl As Long, ByVal pszPath As String) As Long
        
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" ( _
    ByVal hwndOwner As Long, ByVal nFolder As Long, ByRef pIdl As Long) As Long
        
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" ( _
    ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Declare Function GetTempFileName Lib "kernel32.dll" Alias "GetTempFileNameA" ( _
    ByVal lpszPath As String, ByVal lpPrefixString As String, _
    ByVal wUnique As Long, ByVal lpTempFileName As String) As Long

Private Declare Sub CoTaskMemFree Lib "ole32.dll" ( _
    ByRef pv As Any)

Private Const MAX_PATH As Long = 260
Private Const NOERROR As Long = 0&

Public Enum ShellFolder
    CSIDL_DESKTOP = &H0&    ' <desktop>
    CSIDL_INTERNET = &H1&   ' Internet Explorer (icon on desktop)
    CSIDL_PROGRAMS = &H2&   ' Start Menu\Programs
    CSIDL_CONTROLS = &H3&   ' My Computer\Control Panel
    CSIDL_PRINTERS = &H4&   ' My Computer\Printers
    CSIDL_PERSONAL = &H5&   ' My Documents
    CSIDL_FAVORITES = &H6&  ' <user name>\Favorites
    CSIDL_STARTUP = &H7&    ' Start Menu\Programs\Startup
    CSIDL_RECENT = &H8&     ' <user name>\Recent
    CSIDL_SENDTO = &H9&     ' <user name>\SendTo
    CSIDL_BITBUCKET = &HA&  ' <desktop>\Recycle Bin
    CSIDL_STARTMENU = &HB&  ' <user name>\Start Menu
    CSIDL_MYDOCUMENTS = CSIDL_PERSONAL ' Personal was just a silly name for My Documents
    CSIDL_MYMUSIC = &HD&    ' "My Music" folder
    CSIDL_MYVIDEO = &HE&    ' "My Videos" folder
    CSIDL_DESKTOPDIRECTORY = &H10& ' <user name>\Desktop
    CSIDL_DRIVES = &H11&    ' My Computer
    CSIDL_NETWORK = &H12&   ' Network Neighborhood (My Network Places)
    CSIDL_NETHOOD = &H13&   ' <user name>\nethood
    CSIDL_FONTS = &H14&     ' windows\fonts
    CSIDL_TEMPLATES = &H15&
    CSIDL_COMMON_STARTMENU = &H16& ' All Users\Start Menu
    CSIDL_COMMON_PROGRAMS = &H17& ' All Users\Start Menu\Programs
    CSIDL_COMMON_STARTUP = &H18& ' All Users\Startup
    CSIDL_COMMON_DESKTOPDIRECTORY = &H19& ' All Users\Desktop
    CSIDL_APPDATA = &H1A& ' <user name>\Application Data
    CSIDL_PRINTHOOD = &H1B& ' <user name>\PrintHood
    CSIDL_LOCAL_APPDATA = &H1C& ' <user name>\Local Settings\Applicaiton Data (non roaming)
    CSIDL_ALTSTARTUP = &H1D& ' non localized startup
    CSIDL_COMMON_ALTSTARTUP = &H1E& ' non localized common startup
    CSIDL_COMMON_FAVORITES = &H1F&
    CSIDL_INTERNET_CACHE = &H20&
    CSIDL_COOKIES = &H21&
    CSIDL_HISTORY = &H22&
    CSIDL_COMMON_APPDATA = &H23& ' All Users\Application Data
    CSIDL_WINDOWS = &H24& ' GetWindowsDirectory()
    CSIDL_SYSTEM = &H25& ' GetSystemDirectory()
    CSIDL_PROGRAM_FILES = &H26& ' C:\Program Files
    CSIDL_MYPICTURES = &H27& ' C:\Program Files\My Pictures
    CSIDL_PROFILE = &H28& ' USERPROFILE
    CSIDL_SYSTEMX86 = &H29& ' x86 system directory on RISC
    CSIDL_PROGRAM_FILESX86 = &H2A& ' x86 C:\Program Files on RISC
    CSIDL_PROGRAM_FILES_COMMON = &H2B& ' C:\Program Files\Common
    CSIDL_PROGRAM_FILES_COMMONX86 = &H2C& ' x86 Program Files\Common on RISC
    CSIDL_COMMON_TEMPLATES = &H2D& ' All Users\Templates
    CSIDL_COMMON_DOCUMENTS = &H2E& ' All Users\Documents
    CSIDL_COMMON_ADMINTOOLS = &H2F& ' All Users\Start Menu\Programs\Administrative Tools
    CSIDL_ADMINTOOLS = &H30& ' <user name>\Start Menu\Programs\Administrative Tools
    CSIDL_CONNECTIONS = &H31& ' Network and Dial-up Connections
    CSIDL_COMMON_MUSIC = &H35& ' All Users\My Music
    CSIDL_COMMON_PICTURES = &H36& ' All Users\My Pictures
    CSIDL_COMMON_VIDEO = &H37& ' All Users\My Video
    CSIDL_RESOURCES = &H38& ' Resource Direcotry
    CSIDL_RESOURCES_LOCALIZED = &H39& ' Localized Resource Direcotry
    CSIDL_COMMON_OEM_LINKS = &H3A& ' Links to All Users OEM specific apps
    CSIDL_CDBURN_AREA = &H3B& ' USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
    CSIDL_COMPUTERSNEARME = &H3D& ' Computers Near Me (computered from Workgroup membership)
End Enum

Public Function GetShellFolder(ByVal Num As ShellFolder) As String
    Dim Buff As String
    Dim pIdl As Long
   
    If SHGetSpecialFolderLocation(0, Num, pIdl) = NOERROR Then
        Buff = String$(MAX_PATH * 2, 0)
        If SHGetPathFromIDList(pIdl, Buff) Then _
            GetShellFolder = Left$(Buff, InStr(Buff, Chr(0)) - 1)
        Call CoTaskMemFree(ByVal pIdl)
    End If
End Function

Public Function GetTempFolder() As String
Dim sRet As String, cbRet As Long

    sRet = String$(MAX_PATH, 0)
    cbRet = GetTempPath(Len(sRet), sRet)
    GetTempFolder = Left$(sRet, cbRet)
End Function

Public Function CreateNewTempFileInFolder(ByVal Folder As String, Optional ByVal Prefix As String, Optional Unique As Long) As String
Dim sRet As String, cbRet As Long

    sRet = String$(MAX_PATH, 0)
    cbRet = GetTempFileName(Directory, Prefix, Unique, sRet)
    If cbRet Then
        cbRet = InStr(Len(Directory), sRet, vbNullChar) - 1
        CreateNewTempFileInFolder = Left$(sRet, cbRet)
    End If
End Function
'----- Ende Modul "modShellDirs" alias modShellDirs.bas -----
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel 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.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 17 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von MaXX am 18.07.2009 um 15:18

so wird das NullByte am ende des Strings entfernt:

Public Function GetPath(Num As Long) As String
Dim Result As Long
Dim Buff As String
Dim idl As ITEMIDLIST

Result = SHGetSpecialFolderLocation(0, Num, idl)

If Result = NOERROR Then
Buff = Space$(512)
Result = SHGetPathFromIDList(ByVal idl.mkid.cb, ByVal Buff)

If Result Then
GetPath = Trim$(Buff)
GetPath = Mid$(GetPath, 1, Len(GetPath) - 1)
End If

Else
MsgBox "%WINDIR% nicht ermittelbar", , "WinDir"
End
End If
End Function

Kommentar von Nico am 12.04.2009 um 17:54

Das normale windowsverzeichniss kannste einfach mit
environ("windir") oder mit environ("SystemRoot") auslesen.

Kommentar von swat am 20.05.2007 um 00:07

Autsch. Ein Steuerelementfeld wäre da besser...

' Steuerelement: Beschriftungsfeld "Label12"
' Steuerelement: Beschriftungsfeld "Label2"
...
' Steuerelement: Beschriftungsfeld "Label25"
25? Warum steht im Quelltext dann nix von Label25?

Kommentar von am 06.03.2007 um 13:53

@Philipp
es war SHGetSpecialFolderPathA, damit hatte ich Probleme unter Windows NT 4.0, deshalb ist der Code auch ausgegraut in der Funktion Environment.GetFolderPath; schläfst du eigentlich auch irgendwann ? ;-)
+Oliver

Kommentar von Philipp Stephani am 06.03.2007 um 03:10

Also in meiner MSDN Library steht, dass es auch unter Windows 95 mit IE 5 vorhanden ist. Hab ich aber nicht getestet. Die MSDN Library meint halt, dass SHGetSpecialFolderPath und SHGetSpecialFolderLocation veraltet seien und man lieber SHGetFolderPath bzw. SHGetFolderLocation verwenden solle.

Kommentar von Oliver Meyer am 06.03.2007 um 01:11

@Philipp Stephani,
ich weiß ja nich ob sies wußten, aber SHGetFolderPath steht nicht auf älteren Betriebssystemen zur Verfügung.

Kommentar von Philipp Stephani am 16.02.2006 um 23:27

Warum wird eigentlich die Kombination SHGetSpecialFolderLocation + SHGetPathFromIDList statt SHGetFolderPath verwendet? Ich sehe darin keinerlei Vorteile.

Kommentar von Hardy Rothe am 28.11.2005 um 02:03

die Konstante CSIDL_DRIVES zeigt auf den virtuellen Ordner "Arbeitsplatz/My Computer" und nicht auf Treiber.

Kommentar von Florian Rittmeier am 27.02.2005 um 14:32

CSIDL_BITBUCKET ist der Papierkorb

Kommentar von dau am 30.01.2005 um 09:49

Wäre

szBuffer = Space$(512)
lResult = SHGetSpecialFolderPath(ByVal 0, szBuffer, uFoldertype, False)
szBuffer = Left$(szBuffer, InStr(szBuffer, vbNullChar) - 1)

nicht geringfügig einfacher?

Kommentar von Markus Gries am 09.10.2004 um 13:11

Ich habe das Problem schon im VB5/6 Forum gepostet:

Die Funktion gibt eine Zeichenfolge mit Nullstring am Ende zurück. Da ich das nicht wußte, bin ich fast an dem Versuch verzweifelt, den String mit einem anderen zu verknüpfen...

@Konrad:

Könntest Du das bitte noch beheben? Ansonsten bin ich wahrscheinlich nicht der letzte, der davor sitzt und sich die Haare büschelweise rausreißt ;-)

Gruß Markus

Kommentar von am 10.03.2004 um 15:47

Den Papierkorb findet man normalerweise unter (Laufwerk):\RECYCLED. Der Ordner ist versteckt

Kommentar von Jens am 23.10.2001 um 23:36

Mit SHGetSpecialFolderPath geht das übrigens auch. Man erspart sich dabei diesen dämlichen idl-Quatsch. Komisch nur: Lt. Doku soll SHGetSpecialFolderPath NOERROR zurückgeben, wenn erfolgreich ( = 0 ). Bei mir aber gibt die Funktion immer 1 zurück, wenn erfolgreich. Warum denn dieses?

Kommentar von Boris Wilhelms am 08.10.2001 um 13:05

Einfacher geht es mit
windowsverzeichnis = environ("windir")!

Kommentar von XPGP am 27.08.2001 um 16:59

bei mir funktioniert das mit CSIDL_WINDOWS nicht! Das Label ist dann einfach nur Leer!(ich hab win98)

Kommentar von Marcus Schmitz am 12.08.2001 um 11:34

Weiß jemand, wie man unter Windows 2000 das Verzeichnis für den Papierkorb finden kann. In diesem Beispiel funktioniert das unter W2K nicht.

Kommentar von Unknown am 23.03.2001 um 16:19

Wie kann ich das normale Win-Verzeichnis erfahren?
(bei mir C:\Windows)