VB 5/6-Tipp 0061: Windows-Verzeichnisse erfassen
von ActiveVB
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:
| Verwendete API-Aufrufe: 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 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-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)



