Comment trouver l'emplacement de certains dossiers spéciaux ?
Il faut employer l'API SHGetSpecialFolderLocation. Voici le code
d'une fonction permettant de retourner le chemin de n'importe quel dossier
spécial. Ce code est à placer dans un module :
Option Explicit
' Déclaration des Api
Public Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal
hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal
pidList As Long, ByVal lpBuffer As String) As Long
' Enumération des dossiers spéciaux
Public Enum SpecialFoldersConstants
CSIDL_ADMINTOOLS = &H30
CSIDL_ALTSTARTUP = &H1D
CSIDL_APPDATA = &H1A
CSIDL_BITBUCKET = &HA
CSIDL_COMMON_ADMINTOOLS = &H2F
CSIDL_COMMON_ALTSTARTUP = &H1E
CSIDL_COMMON_APPDATA = &H23
CSIDL_COMMON_DESKTOPDIRECTORY = &H19
CSIDL_COMMON_DOCUMENTS = &H2E
CSIDL_COMMON_FAVORITES = &H1F
CSIDL_COMMON_PROGRAMS = &H17
CSIDL_COMMON_STARTMENU = &H16
CSIDL_COMMON_STARTUP = &H18
CSIDL_COMMON_TEMPLATES = &H2D
CSIDL_CONTROLS = &H3
CSIDL_COOKIES = &H21
CSIDL_DESKTOP = &H0
CSIDL_DESKTOPDIRECTORY = &H10
CSIDL_DRIVES = &H11
CSIDL_FAVORITES = &H6
CSIDL_FLAG_CREATE = &H8000
CSIDL_FLAG_DONT_VERIFY = &H4000
CSIDL_FLAG_MASK = &HFF00
CSIDL_FONTS = &H14
CSIDL_HISTORY = &H22
CSIDL_INTERNET = &H1
CSIDL_INTERNET_CACHE = &H20
CSIDL_LOCAL_APPDATA = &H1C
CSIDL_MYPICTURES = &H27
CSIDL_NETHOOD = &H13
CSIDL_NETWORK = &H12
CSIDL_PERSONAL = &H5
CSIDL_PRINTERS = &H4
CSIDL_PRINTHOOD = &H1B
CSIDL_PROFILE = &H28
CSIDL_PROGRAM_FILES = &H26
CSIDL_PROGRAM_FILES_COMMON = &H2B
CSIDL_PROGRAM_FILES_COMMONX86 = &H2C
CSIDL_PROGRAM_FILESX86 = &H2A
CSIDL_PROGRAMS = &H2
CSIDL_RECENT = &H8
CSIDL_SENDTO = &H9
CSIDL_STARTMENU = &HB
CSIDL_STARTUP = &H7
CSIDL_SYSTEM = &H25
CSIDL_SYSTEMX86 = &H29
CSIDL_TEMPLATES = &H15
CSIDL_WINDOWS = &H24
End Enum
' Type
Private Type SHITEMID
cb As Long
abID As Byte
End Type
Private Type ITEMIDLIST
mkid As SHITEMID
End Type
' Constantes
Public Const MAX_PATH = 260
Public Function GetSpecialFolder(SpecialFolder As SpecialFoldersConstants) As
String
' Les variables
Dim RC As Long
Dim IDL As ITEMIDLIST
Dim sPath As String
' Récupère le dossier spécial
RC = SHGetSpecialFolderLocation(100, SpecialFolder, IDL)
If RC = 0 Then
' Crée un tampon
sPath = Space$(MAX_PATH)
' Récupère le path à partir de l'IDList
SHGetPathFromIDList ByVal IDL.mkid.cb,
ByVal sPath
' Supprime les chr$(0) inutiles
sPath = Left$(sPath, InStr(sPath,
Chr$(0)) - 1)
If Right$(sPath, 1) <>
"\" Then sPath = sPath & "\"
Else
sPath = ""
End If
GetSpecialFolder = sPath
End Function
Exemple d'utilisation de la fonction :
Private Sub Form_Load()
MsgBox GetSpecialFolder(CSIDL_PERSONAL)
End Sub
Remarque : Certains dossiers n'existent que sous Windows NT, 2000 et XP. Comme par exemple le
dossier des outils d'administration (CSIDL_ADMINTOOLS). |