VB 5/6-Tipp 0061: Windows-Verzeichnisse erfassen
von Kai
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: | Verwendete API-Aufrufe: CoTaskMemFree, GetTempFileNameA (GetTempFileName), GetTempPathA (GetTempPath), SHGetPathFromIDListA (SHGetPathFromIDList), SHGetSpecialFolderLocation | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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)