Die Community zu .NET und Classic VB.

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.

Dieser Tipp wurde von Konrad Rudolph am 23. September 2004 noch einmal komplett überarbeitet und um weitere Konstanten ergänzt.
Update am 07. April 2005 von Jochen Wierum nach einem Hinweis von Markus Gries: Die Strings werden nun bis zu den Nullterminierungszeichen begrenzt.

Zu diesem Tipp existieren im Tippupload die folgende(n) Aktualisierung(en):
[VB 5/6 Tippvorschlag 0326] Windows-Verzeichnisse erfassen

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

GetTempPathA (GetTempPath), SHGetPathFromIDListA (SHGetPathFromIDList), SHGetSpecialFolderLocation

Download:

Download des Beispielprojektes [3,35 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 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, pidl As ITEMIDLIST) As Long
        
Private Declare Function GetTempPath Lib "kernel32" Alias _
        "GetTempPathA" (ByVal nBufferLength As Long, ByVal _
        lpBuffer As String) As Long
        
Private Type ITEMID
    cb As Long
    abID As Byte
End Type

Private Type ITEMIDLIST
    mkid As ITEMID
End Type

Private Const CSIDL_FLAG_CREATE As Long = &H8000&

Private Const CSIDL_ADMINTOOLS As Long = &H30
Private Const CSIDL_ALTSTARTUP As Long = &H1D

' Anwendungsdaten
Private Const CSIDL_APPDATA As Long = &H1A

Private Const CSIDL_BITBUCKET As Long = &HA

' CD Burning
Private Const CSIDL_CDBURN_AREA As Long = &H3B

' Für alle Benutzer (All Users)
Private Const CSIDL_COMMON_ADMINTOOLS As Long = &H2F
Private Const CSIDL_COMMON_ALTSTARTUP As Long = &H1D
Private Const CSIDL_COMMON_APPDATA As Long = &H23

' Desktop
Private Const CSIDL_COMMON_DESKTOPDIRECTORY As Long = &H19

Private Const CSIDL_COMMON_DOCUMENTS As Long = &H2E

' Favoriten
Private Const CSIDL_COMMON_FAVORITES As Long = &H1F

' Gemeinsame Musik
Private Const CSIDL_COMMON_MUSIC As Long = &H35

' Gemeinsame Bilder
Private Const CSIDL_COMMON_PICTURES As Long = &H36

' Programme-Ordner im Startmenü
Private Const CSIDL_COMMON_PROGRAMS As Long = &H17

' Starmenü
Private Const CSIDL_COMMON_STARTMENU As Long = &H16

' Autostart
Private Const CSIDL_COMMON_STARTUP As Long = &H18

' Vorlagen
Private Const CSIDL_COMMON_TEMPLATES As Long = &H2D

' Gemeinsame Videos
Private Const CSIDL_COMMON_VIDEO As Long = &H37



Private Const CSIDL_CONTROLS As Long = &H3

' Cookies
Private Const CSIDL_COOKIES As Long = &H21

' Desktop
Private Const CSIDL_DESKTOP As Long = &H0
Private Const CSIDL_DESKTOPDIRECTORY As Long = &H10

' Treiber
Private Const CSIDL_DRIVES As Long = &H11

' Favoriten
Private Const CSIDL_FAVORITES As Long = &H6

' Schriftarten
Private Const CSIDL_FONTS As Long = &H14

' Verlauf
Private Const CSIDL_HISTORY As Long = &H22

Private Const CSIDL_INTERNET As Long = &H1

' Temporäre Internetdateien
Private Const CSIDL_INTERNET_CACHE As Long = &H20

' Anwendungsdaten
Private Const CSIDL_LOCAL_APPDATA As Long = &H1C

Private Const CSIDL_MYDOCUMENTS As Long = &HC

' Eigene Musik
Private Const CSIDL_MYMUSIC As Long = &HD

' Eigene Bilder
Private Const CSIDL_MYPICTURES As Long = &H27

' Eigene Videos
Private Const CSIDL_MYVIDEO As Long = &HE

' Netzwerkumgebung
Private Const CSIDL_NETHOOD As Long = &H13

Private Const CSIDL_NETWORK As Long = &H12

' Eigene Dateien
Private Const CSIDL_PERSONAL As Long = &H5

Private Const CSIDL_PRINTERS As Long = &H4

' Druckerumgebung
Private Const CSIDL_PRINTHOOD As Long = &H1B

' Profil
Private Const CSIDL_PROFILE As Long = &H28

' Programme
Private Const CSIDL_PROGRAM_FILES As Long = &H26

' Gemeinsamme Dateien
Private Const CSIDL_PROGRAM_FILES_COMMON As Long = &H2B

' Programme (im Startmenü)
Private Const CSIDL_PROGRAMS As Long = &H2

' Zuletzt verwendete Dokumente
Private Const CSIDL_RECENT As Long = &H8

' Senden An
Private Const CSIDL_SENDTO As Long = &H9

' Startmenü
Private Const CSIDL_STARTMENU As Long = &HB

' Autostart
Private Const CSIDL_STARTUP As Long = &H7

' System (bzw. System32)
Private Const CSIDL_SYSTEM As Long = &H25

' Vorlagen
Private Const CSIDL_TEMPLATES As Long = &H15

' Windows
Private Const CSIDL_WINDOWS As Long = &H24

Private Const NOERROR As Long = 0&

Private Sub Form_Load()
    Dim Result As Long
    Dim Buff As String
    
    Label1.Caption = GetPath(CSIDL_DESKTOPDIRECTORY)
    Label2.Caption = GetPath(CSIDL_STARTMENU)
    Label3.Caption = GetPath(CSIDL_PROGRAM_FILES)
    Label4.Caption = GetPath(CSIDL_PERSONAL)
    Label5.Caption = GetPath(CSIDL_FAVORITES)
    Label6.Caption = GetPath(CSIDL_COMMON_STARTUP)
    Label7.Caption = GetPath(CSIDL_RECENT)
    Label8.Caption = GetPath(CSIDL_SENDTO)
    Label9.Caption = GetPath(CSIDL_TEMPLATES)
    Label10.Caption = GetPath(CSIDL_NETWORK)
    Label11.Caption = GetPath(CSIDL_FONTS)
    Label12.Caption = GetPath(CSIDL_INTERNET_CACHE)
       
    Buff = Space$(512)
    Result = GetTempPath(Len(Buff), Buff)
    Label13.Caption = Trim$(Buff)
End Sub

Private Function GetPath(Num As Long) As String
    Dim Result As Long
    Dim Buff As String
    Dim idl As ITEMIDLIST
   
    Result = SHGetSpecialFolderLocation(Me.hWnd, Num, idl)
    If Result = NOERROR Then
        Buff = Space$(512)
        Result = SHGetPathFromIDList(ByVal idl.mkid.cb, ByVal Buff)
        If Result Then
            GetPath = Left(Buff, InStr(Buff, Chr(0)) - 1)
        End If
    End If
End Function
'---------- Ende Formular "Form1" alias FORM1.FRM  ----------
'-------------- 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)