Page 1 sur 1

Dossier spéciaux de windows - Nom, Adresse et Icône

Publié : mer. 01/déc./2004 19:33
par Le Soldat Inconnu
Salut,

Je me suis penché cet après midi sur la procedure GetSpecialFolderlocation( d'ici :
http://purebasic.hmt-forum.com/viewtopic.php?t=36

et je me suis dis, mais qu'est-ce que c'est que cette horreur de code 8O

Code : Tout sélectionner

Procedure.s GetSpecialFolderLocation(lngCSIDL.l) 
  Protected lngRet.l 
  Protected strLocation.s 
  Protected pidl.l 
  strLocation = Space(260) 
  lngRet = SHGetSpecialFolderLocation_(0, lngCSIDL, @pidl) 
  If lngRet = 0 
    SHGetPathFromIDList_(pidl, @strLocation) 
    If lngRet = 0 
      strLocation = RTrim(strLocation) 
      If Right(strLocation, 1) <> "\" 
        strLocation = strLocation + "\" 
      EndIf 
      ProcedureReturn strLocation 
    EndIf 
    CoTaskMemFree_(pidl) 
  EndIf 
EndProcedure 
2 tests "If lngRet = 0" , idiot, le 2ème sert strictement à rien.
le CoTaskMemFree_(pidl) qui ne sert à rien car il a le ProcedureReturn avant.

Parfois, c'est pas bon de piocher dans code-archiv sans réfléchir.

Bon, je dis simplement ça si certain, comme moi on eu la bonne idée de piocher dans ce code sans se poser trop de question :roll: :wink: (moi, quand j'ai piqué cette procedure, l'API me passait largement au dessus de la tête et j'avais même pas cherché à comprendre)
Donc voilà si vous avez utilisé ce truc, je pense qu'une correction s'impose.



Personellement, j'ai tout refait, et j'ai amélioré la chose en la complétant.
A savoir, j'ai sorti les fonctions suivantes :
- Récupérer le nom du dossier
- Récupérer l'icône du dossier en 16*16 ou 32*32
- Récupérer l'adresse du dossier

Ce qui est cool, c'est que ça permet de récupérer les icônes du "poste de travail", de la "corbeille", des "favoris réseau", etc... :D

voila le code avec un exemple :

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.90 
; 
; Explication du programme : 
; Récupérer le nom, l'adresse et l'icône des dossiers spéciaux de windows 

ProcedureDLL.s GetSpecialFolderLocation(Valeur.l) ; Récupère l'adresse d'un dossier spécifique de Windows 
  Protected SpecialFolderLocation.s, Dossier_ID.l 
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0 
    SpecialFolderLocation = Space(#MAX_PATH) 
    SHGetPathFromIDList_(Dossier_ID, @SpecialFolderLocation) 
    If SpecialFolderLocation 
      If Right(SpecialFolderLocation, 1) <> "\" 
        SpecialFolderLocation + "\" 
      EndIf 
    EndIf 
  EndIf 
  ProcedureReturn SpecialFolderLocation 
EndProcedure 

ProcedureDLL.s GetSpecialFolderName(Valeur.l) ; Récupère le nom d'un dossier spécifique de Windows 
  Protected SpecialFolderName.s, Dossier_ID.l 
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0 
    SpecialFolderName = Space(#MAX_PATH) 
    SHGetPathFromIDList_(Dossier_ID, @SpecialFolderName) 
    If SpecialFolderName 
      SpecialFolderName = GetFilePart(SpecialFolderName) 
    Else 
      Select Valeur 
        Case 1 : SpecialFolderName = "Internet explorer" 
        Case 3 : SpecialFolderName = "Panneau de configuration" 
        Case 4 : SpecialFolderName = "Imprimantes et télécopieurs" 
        Case 10 : SpecialFolderName = "Corbeille" 
        Case 17 : SpecialFolderName = "Poste de travail" 
        Case 18 : SpecialFolderName = "Favoris réseau" 
        Case 49 : SpecialFolderName = "Connexions réseau" 
        Case 61 : SpecialFolderName = "Réseau" 
      EndSelect 
    EndIf 
  EndIf 
  ProcedureReturn SpecialFolderName 
EndProcedure 

ProcedureDLL.l GetSpecialFolderSmallIcon(Valeur.l) ; Récupère l'icône 16*16 d'un dossier spécifique de Windows 
  Protected Dossier.SHFILEINFO, Dossier_ID.l, Icone 
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0 
    SHGetFileInfo_(Dossier_ID, 0, @Dossier, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_PIDL | #SHGFI_SMALLICON) 
  EndIf 
  ProcedureReturn Dossier\hIcon 
EndProcedure 

ProcedureDLL.l GetSpecialFolderLargeIcon(Valeur.l) ; Récupère l'icône 32*32 d'un dossier spécifique de Windows 
  Protected Dossier.SHFILEINFO, Dossier_ID.l, Icone 
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0 
    SHGetFileInfo_(Dossier_ID, 0, @Dossier, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_PIDL | #SHGFI_LARGEICON) 
  EndIf 
  ProcedureReturn Dossier\hIcon 
EndProcedure 



;- Programme principal 

; Création de la fenêtre et de la GadgetList 
If OpenWindow(0, 0, 0, 800, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Icône") = 0 Or CreateGadgetList(WindowID()) = 0 
  End 
EndIf 

; On crée un liste 
ListIconGadget(1, 0, 0, 800, 200, "Valeur", 60, #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect) 
AddGadgetColumn(1, 1, "Nom", 150) 
AddGadgetColumn(1, 2, "Adresse du dossier", 560) 

; On liste tous les dossier systèmes récupérables 
For n = 0 To 200 
  Nom.s = GetSpecialFolderName(n) ; On récupère le nom du dossier 
  Adresse.s = GetSpecialFolderLocation(n) ; On récupère l'adresse du dossier 
  If Nom
    If Adresse = "" ; Affichage dans le debugger des dossiers
      Debug RSet(Str(n), 2, "0") + "     Pas de dossier, il s'agit de : " + Nom
    Else
      Debug RSet(Str(n), 2, "0") + "     " + Adresse
    EndIf
    AddGadgetItem(1, -1, Str(n) + Chr(10) + Nom + Chr(10) + Adresse) ; On affiche 
  EndIf 
Next 

; On affiche l'icône du premier élément 
SetGadgetState(1, 0) ; on sélectionne le premier élément 
TextGadget(4, 5, 215, 200, 15, "Icône du dossier sélectionné :") 
ImageGadget(2, 5, 235, 16, 16, GetSpecialFolderSmallIcon(0)) ; en 16 * 16 
ImageGadget(3, 50, 235, 32, 32, GetSpecialFolderLargeIcon(0)) ; en 32 * 32 

Repeat 
  Event = WaitWindowEvent() 
  
  If Event = #PB_EventGadget 
    Select EventGadgetID() ; Gadgets 
      Case 1 
        Position = GetGadgetState(1) 
        If Position >= 0 
          Valeur = Val(GetGadgetItemText(1, Position, 0)) 
          SetGadgetState(2, GetSpecialFolderSmallIcon(Valeur)) 
          SetGadgetState(3, GetSpecialFolderLargeIcon(Valeur)) 
        EndIf 
    EndSelect 
  EndIf 
  
Until Event = #PB_EventCloseWindow 

End 




; Voici la liste des valeurs obtenues sous Windows XP (Certaines valeurs n'ont pas de dossier sous d'autres version de Windows) 

; 00     C:\Documents And Settings\Le Soldat Inconnu\Bureau\ 
; 01     Pas de dossier, il s'agit de : Internet Explorer 
; 02     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\Programmes\ 
; 03     Pas de dossier, il s'agit de : Panneau de configuration 
; 04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs 
; 05     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\ 
; 06     C:\Documents And Settings\Le Soldat Inconnu\Favoris\ 
; 07     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\Programmes\Démarrage\ 
; 08     C:\Documents And Settings\Le Soldat Inconnu\Recent\ 
; 09     C:\Documents And Settings\Le Soldat Inconnu\SendTo\ 
; 10     Pas de dossier, il s'agit de : Corbeille 
; 11     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\ 
; 13     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\Ma musique\ 
; 16     C:\Documents And Settings\Le Soldat Inconnu\Bureau\ 
; 17     Pas de dossier, il s'agit de : Poste de travail 
; 18     Pas de dossier, il s'agit de : Favoris réseau 
; 19     C:\Documents And Settings\Le Soldat Inconnu\Voisinage réseau\ 
; 20     C:\WINDOWS\Fonts\ 
; 21     C:\Documents And Settings\Le Soldat Inconnu\Modèles\ 
; 22     C:\Documents And Settings\All Users\Menu Démarrer\ 
; 23     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\ 
; 24     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\Démarrage\ 
; 25     C:\Documents And Settings\All Users\Bureau\ 
; 26     C:\Documents And Settings\Le Soldat Inconnu\Application Data\ 
; 27     C:\Documents And Settings\Le Soldat Inconnu\Voisinage D'impression\ 
; 28     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Application Data\ 
; 31     C:\Documents And Settings\All Users\Favoris\ 
; 32     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Temporary Internet Files\ 
; 33     C:\Documents And Settings\Le Soldat Inconnu\Cookies\ 
; 34     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Historique\ 
; 35     C:\Documents And Settings\All Users\Application Data\ 
; 36     C:\WINDOWS\ 
; 37     C:\WINDOWS\system32\ 
; 38     C:\Program Files\ 
; 39     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\Mes images\ 
; 40     C:\Documents And Settings\Le Soldat Inconnu\ 
; 41     C:\WINDOWS\system32\ 
; 43     C:\Program Files\Fichiers communs\ 
; 45     C:\Documents And Settings\All Users\Modèles\ 
; 46     C:\Documents And Settings\All Users\Documents\ 
; 47     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\Outils D'administration\ 
; 49     Pas de dossier, il s'agit de : Connexions réseau 
; 54     C:\Documents And Settings\All Users\Documents\Mes images\ 
; 56     C:\WINDOWS\Resources\ 
; 59     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Application Data\Microsoft\CD Burning\ 
; 61     Pas de dossier, il s'agit de : Réseau 


; Voici la liste des valeurs obtenues sous Windows ME

; 00     C:\WINDOWS\Bureau\
; 01     Pas de dossier, il s'agit de : Internet explorer
; 02     C:\WINDOWS\Menu Démarrer\Programmes\
; 03     Pas de dossier, il s'agit de : Panneau de configuration
; 04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs
; 05     C:\Mes documents\
; 06     C:\WINDOWS\Favoris\
; 07     C:\WINDOWS\Menu Démarrer\Programmes\Démarrage\
; 08     C:\WINDOWS\Recent\
; 09     C:\WINDOWS\SendTo\
; 10     Pas de dossier, il s'agit de : Corbeille
; 11     C:\WINDOWS\Menu Démarrer\
; 13     C:\Mes documents\Ma musique\
; 14     C:\Mes documents\Mes vidéos\
; 16     C:\WINDOWS\Bureau\
; 17     Pas de dossier, il s'agit de : Poste de travail
; 18     Pas de dossier, il s'agit de : Favoris réseau
; 19     C:\WINDOWS\Voisinage réseau\
; 20     C:\WINDOWS\FONTS\
; 21     C:\WINDOWS\Modèles\
; 24     C:\WINDOWS\All Users\Menu Démarrer\Programmes\Démarrage\
; 25     C:\WINDOWS\All Users\Bureau\
; 26     C:\WINDOWS\Application Data\
; 27     C:\WINDOWS\Voisinage d'impression\
; 28     C:\WINDOWS\Application Data\
; 32     C:\WINDOWS\Temporary Internet Files\
; 33     C:\WINDOWS\COOKIES\
; 34     C:\WINDOWS\Historique\
; 35     C:\WINDOWS\All Users\Application Data\
; 36     C:\WINDOWS\
; 37     C:\WINDOWS\SYSTEM\
; 38     C:\Program Files\
; 39     C:\Mes documents\Mes images\
; 41     C:\WINDOWS\SYSTEM\
; 43     C:\Program Files\Fichiers communs\
; 46     C:\WINDOWS\All Users\Documents\
; 49     Pas de dossier, il s'agit de : Connexions réseau


; Voici la liste des valeurs obtenues sous Windows 98

; 00     C:\WINDOWS\Bureau\ 
; 01     Pas de dossier, il s'agit de : Internet explorer 
; 02     C:\WINDOWS\Menu Démarrer\Programmes\ 
; 03     Pas de dossier, il s'agit de : Panneau de configuration 
; 04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs 
; 05     C:\Mes documents\ 
; 06     C:\WINDOWS\Favoris\ 
; 07     C:\WINDOWS\Menu Démarrer\Programmes\Démarrage\ 
; 08     C:\WINDOWS\Recent\ 
; 09     C:\WINDOWS\SendTo\ 
; 10     Pas de dossier, il s'agit de : Corbeille 
; 11     Menu Démarrer C:\WINDOWS\Menu Démarrer\ 
; 16     C:\WINDOWS\Bureau\ 
; 17     Pas de dossier, il s'agit de : Poste de travail 
; 18     Pas de dossier, il s'agit de : Favoris réseau 
; 19     C:\WINDOWS\Voisinage réseau\ 
; 20     C:\WINDOWS\FONTS\ 
; 21     C:\WINDOWS\ShellNew\ 
; 26     C:\WINDOWS\Application Data\ 
; 27     C:\WINDOWS\PrintHood\ 
; 32     C:\WINDOWS\Temporary Internet Files\ 
; 33     C:\WINDOWS\Cookies\ 
; 34     C:\WINDOWS\Historique\ 
Alors si vous pouviez tester le bazar sur d'autres OS que XP et fournir la liste des dossiers obtenus.
Ca serai cool. Car les dossiers obtenus sous XP sont plus nombreux que sur les autres OS et pour des problème de compatibilité, ce serait bien de savoir ce qui est dispo sur chaque OS.

Publié : mer. 01/déc./2004 20:41
par Dräc
Voila ce que j'obtiens sur 98SE

Code : Tout sélectionner

0 Bureau C:\WINDOWS\Bureau\
1 Internet explorer 
2 Programmes C:\WINDOWS\Menu Démarrer\Programmes\
3 Panneau de configuration 
4 Imprimantes et télécopieurs 
5 Mes documents C:\Mes documents\
6 Favoris C:\WINDOWS\Favoris\
7 Démarrage C:\WINDOWS\Menu Démarrer\Programmes\Démarrage\
8 Recent C:\WINDOWS\Recent\
9 SendTo C:\WINDOWS\SendTo\
10 Corbeille 
11 Menu Démarrer C:\WINDOWS\Menu Démarrer\
16 Bureau C:\WINDOWS\Bureau\
17 Poste de travail 
18 Favoris réseau 
19 Voisinage réseau C:\WINDOWS\Voisinage réseau\
20 FONTS C:\WINDOWS\FONTS\
21 ShellNew C:\WINDOWS\ShellNew\
26 Application Data C:\WINDOWS\Application Data\
27 PrintHood C:\WINDOWS\PrintHood\
32 Temporary Internet Files C:\WINDOWS\Temporary Internet Files\
33 Cookies C:\WINDOWS\Cookies\
34 Historique C:\WINDOWS\Historique\

Publié : mer. 01/déc./2004 22:35
par Oliv
Pas de problème sur XP pro :D
c'est vrai que je l'utilise sans avoir même jetté un oeil dessus :oops:

Publié : mer. 01/déc./2004 23:42
par Le Soldat Inconnu
Qui peut me donner les valeur sous 2000 ? Merci
J'ai modifé le code, il suffit de faire un copier coller du contenu du debugger

Publié : jeu. 02/déc./2004 9:49
par Jacobus
Voici le résultat de mon os (à moelle)
Win Me Production Présente :

Code : Tout sélectionner

;00     C:\WINDOWS\Bureau\
;01     Pas de dossier, il s'agit de : Internet explorer
;02     C:\WINDOWS\Menu Démarrer\Programmes\
;03     Pas de dossier, il s'agit de : Panneau de configuration
;04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs
;05     C:\Mes documents\
;06     C:\WINDOWS\Favoris\
;07     C:\WINDOWS\Menu Démarrer\Programmes\Démarrage\
;08     C:\WINDOWS\Recent\
;09     C:\WINDOWS\SendTo\
;10     Pas de dossier, il s'agit de : Corbeille
;11     C:\WINDOWS\Menu Démarrer\
;13     C:\Mes documents\Ma musique\
;14     C:\Mes documents\Mes vidéos\
;16     C:\WINDOWS\Bureau\
;17     Pas de dossier, il s'agit de : Poste de travail
;18     Pas de dossier, il s'agit de : Favoris réseau
;19     C:\WINDOWS\Voisinage réseau\
;20     C:\WINDOWS\FONTS\
;21     C:\WINDOWS\Modèles\
;24     C:\WINDOWS\All Users\Menu Démarrer\Programmes\Démarrage\
;25     C:\WINDOWS\All Users\Bureau\
;26     C:\WINDOWS\Application Data\
;27     C:\WINDOWS\Voisinage d'impression\
;28     C:\WINDOWS\Application Data\
;32     C:\WINDOWS\Temporary Internet Files\
;33     C:\WINDOWS\COOKIES\
;34     C:\WINDOWS\Historique\
;35     C:\WINDOWS\All Users\Application Data\
;36     C:\WINDOWS\
;37     C:\WINDOWS\SYSTEM\
;38     C:\Program Files\
;39     C:\Mes documents\Mes images\
;41     C:\WINDOWS\SYSTEM\
;43     C:\Program Files\Fichiers communs\
;46     C:\WINDOWS\All Users\Documents\
;49     Pas de dossier, il s'agit de : Connexions réseau

Re: Dossier spéciaux de windows - Nom, Adresse et Icône

Publié : sam. 26/sept./2009 21:26
par Le Soldat Inconnu
une mise à jour qui donne accès au icône 48*48 (xp et plus) et 128*128 (vista et plus)

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.3
;
; Explication du programme :
; Récupérer le nom, l'adresse et l'icône des dossiers spéciaux de windows

; Liste des dossiers
#CSIDL_DESKTOP = $0000 ; <DESKTOP>
#CSIDL_PROGRAMS = $0002 ; START MENU\PROGRAMS
#CSIDL_CONTROLS = $0003 ; MY COMPUTER\CONTROL PANE
#CSIDL_PRINTERS = $0004 ; MY COMPUTER\PRINTERS
#CSIDL_PERSONAL = $0005 ; MY DOCUMENTS
#CSIDL_FAVORITES = $0006 ; <USER NAME>\FAVORITES
#CSIDL_STARTUP = $0007 ; START MENU\PROGRAMS\STARTUP
#CSIDL_RECENT = $0008 ; <USER NAME>\RECENT
#CSIDL_SENDTO = $0009 ; <USER NAME>\SENDTO
#CSIDL_BITBUCKET = $000A ; <DESKTOP>\RECYCLE BIN
#CSIDL_STARTMENU = $000B ; <USER NAME>\START MEN
;#CSIDL_MYDOCUMENTS = #CSIDL_PERSONAL ; Personal was just a silly name For My Documents
#CSIDL_MYMUSIC = $000D ; "MY MUSIC" FOLDER
#CSIDL_MYVIDEO = $000E ; "MY VIDEOS" FOLDER
#CSIDL_DESKTOPDIRECTORY = $0010 ; <USER NAME>\DESKTOP
#CSIDL_DRIVES = $0011 ; MY COMPUTER
#CSIDL_NETHOOD = $0013 ; <USER NAME>\NETHOOD
#CSIDL_FONTS = $0014 ; WINDOWS\FONTS
#CSIDL_TEMPLATES = $0015
#CSIDL_COMMON_STARTMENU = $0016 ; ALL USERS\START MEN
#CSIDL_COMMON_PROGRAMS = $0017 ; ALL USERS\START MENU\PROGRAMS
#CSIDL_COMMON_STARTUP = $0018 ; ALL USERS\STARTUP
#CSIDL_COMMON_DESKTOPDIRECTORY = $0019 ; ALL USERS\DESKTOP
#CSIDL_APPDATA = $001A ; <USER NAME>\APPLICATION DATA
#CSIDL_PRINTHOOD = $001B ; <USER NAME>\PRINTHOOD
#CSIDL_ALTSTARTUP = $001D ; NON LOCALIZED STARTUP
#CSIDL_COMMON_ALTSTARTUP = $001E ; NON LOCALIZED COMMON STARTUP
#CSIDL_COMMON_FAVORITES = $001F
#CSIDL_INTERNET_CACHE = $0020
#CSIDL_COOKIES = $0021
#CSIDL_HISTORY = $0022
#CSIDL_COMMON_APPDATA = $0023 ; ALL USERS\APPLICATION DATA
#CSIDL_PROGRAM_FILES = $0026 ; C:\PROGRAM FILES
#CSIDL_MYPICTURES = $0027 ; C:\PROGRAM FILES\MY PICTURES
#CSIDL_PROFILE = $0028 ; USERPROFILE
#CSIDL_SYSTEMX86 = $0029 ; X86 SYSTEM DIRECTORY ON RISC
#CSIDL_PROGRAM_FILESX86 = $002A ; X86 C:\PROGRAM FILES ON RISC
#CSIDL_PROGRAM_FILES_COMMON = $002B ; C:\PROGRAM FILES\COMMON
#CSIDL_PROGRAM_FILES_COMMONX86 = $002C ; X86 PROGRAM FILES\COMMON ON RISC
#CSIDL_COMMON_TEMPLATES = $002D ; ALL USERS\TEMPLATES
#CSIDL_COMMON_DOCUMENTS = $002E ; ALL USERS\DOCUMENTS
#CSIDL_COMMON_ADMINTOOLS = $002F ; ALL USERS\START MENU\PROGRAMS\ADMINISTRATIVE TOOLS
#CSIDL_ADMINTOOLS = $0030 ; <USER NAME>\START MENU\PROGRAMS\ADMINISTRATIVE TOOLS
#CSIDL_CONNECTIONS = $0031 ; NETWORK AND DIAL-UP CONNECTIONS
#CSIDL_COMMON_MUSIC = $0035 ; ALL USERS\MY MUSIC
#CSIDL_COMMON_PICTURES = $0036 ; ALL USERS\MY PICTURES
#CSIDL_COMMON_VIDEO = $0037 ; ALL USERS\MY VIDEO
#CSIDL_RESOURCES = $0038 ; RESOURCE DIRECOTRY
#CSIDL_RESOURCES_LOCALIZED = $0039 ; LOCALIZED RESOURCE DIRECOTRY
#CSIDL_COMMON_OEM_LINKS = $003A ; LINKS TO ALL USERS OEM SPECIFIC APPS
#CSIDL_CDBURN_AREA = $003B ; USERPROFILE\LOCAL SETTINGS\APPLICATION DATA\MICROSOFT\CD BURNING
#CSIDL_FLAG_DONT_VERIFY = $4000 ; COMBINE WITH CSIDL_ VALUE TO RETURN AN UNVERIFIED FOLDER PATH
#CSIDL_FLAG_DONT_UNEXPAND = $2000 ; COMBINE WITH CSIDL_ VALUE TO AVOID UNEXPANDING ENVIRONMENT VARIABLES
#CSIDL_FLAG_NO_ALIAS = $1000 ; COMBINE WITH CSIDL_ VALUE TO INSURE NON-ALIAS VERSIONS OF THE PID
#CSIDL_FLAG_MASK = $FF00 ; MASK FOR ALL POSSIBLE FLAG VALUES

ProcedureDLL.s GetSpecialFolderLocation2(Valeur.l) ; Récupère l'adresse d'un dossier spécifique de Windows
  Protected SpecialFolderLocation.s, Dossier_ID.l
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0
    SpecialFolderLocation = Space(#MAX_PATH)
    SHGetPathFromIDList_(Dossier_ID, @SpecialFolderLocation)
    If SpecialFolderLocation
      If Right(SpecialFolderLocation, 1) <> "\"
        SpecialFolderLocation + "\"
      EndIf
    EndIf
  EndIf
  ProcedureReturn SpecialFolderLocation
EndProcedure

ProcedureDLL.s GetSpecialFolderName2(Valeur.l) ; Récupère le nom d'un dossier spécifique de Windows
  Protected Dossier.SHFILEINFO, Dossier_ID.l
  If SHGetSpecialFolderLocation_(0, Valeur, @Dossier_ID) = 0
    SHGetFileInfo_(Dossier_ID, 0, @Dossier, SizeOf(SHFILEINFO), #SHGFI_PIDL | #SHGFI_DISPLAYNAME)
  EndIf
  ProcedureReturn PeekS( @Dossier\szDisplayName )
EndProcedure

#SHIL_SMALL = $1
#SHIL_LARGE = $0
#SHIL_EXTRALARGE = $2
#SHIL_JUMBO = $4

#LOAD_LIBRARY_AS_DATAFILE = 2
DataSection
  IID_IImageList:
  Data.l $46EB5926
  Data.w $582E,$4017
  Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 
Structure IMAGELISTDRAWPARAMS
  cbSize.l
  himl.l
  i.l
  hdcDst.l
  x.l
  y.l
  cx.l
  cy.l
  xBitmap.l
  yBitmap.l
  rgbBk.l
  rgbFg.l
  fStyle.l
  dwRop.l
  fState.l
  frame.l
  crEffect.l
EndStructure
Interface IImageList2 Extends iUnknown
  Add(hbmImage, hbmMask, pi)
  ReplaceIcon(i, hIcon, pi)
  SetOverlayImage(iImage, iOverlay)
  Replace(i, hbmImage, hbmMask)
  AddMasked(hbmImage, crMask, pi)
  Draw(pimldp.IMAGELISTDRAWPARAMS)
  Remove(i)
  GetIcon(i, flags, picon)
  GetImageInfo(i, pImageInfo.IMAGEINFO)
  Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
  Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
  Clone(riid, ppv)
  GetImageRect(i, prc.RECT)
  GetIconSize(cx, cy)
  SetIconSize(cx, cy)
  GetImageCount(pi)
  SetImageCount(uNewCount)
  SetBkColor(clrBk, pclr)
  GetBkColor(pclr)
  BeginDrag(iTrack, dxHotspot, dyHotspot)
  EndDrag()
  DragEnter(hwndLock, x, y)
  DragLeave(hwndLock)
  DragMove(x, y)
  SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
  DragShowNolock(fShow)
  GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
  GetItemFlags(i, dwFlags)
  GetOverlayImage(iOverlay, piIndex)
EndInterface


Global OS = OSVersion()
ProcedureDLL.l GetSpecialFolderIcon2(CSIDL.l, Size.l)
	Protected hIcon.l, FileInfo.SHFILEINFO, dll_Shell32.l, hResult.l, *Guid.l, IconFile.l
  Select Size
		Case #SHIL_SMALL, 16
      SHIL = #SHIL_SMALL
		Case #SHIL_LARGE, 32
      SHIL = #SHIL_LARGE
		Case #SHIL_EXTRALARGE, 48
      SHIL = #SHIL_EXTRALARGE
		Case #SHIL_JUMBO, 128, 256
      If OS >= #PB_OS_Windows_Vista
        SHIL = #SHIL_JUMBO
			Else
        SHIL = #SHIL_EXTRALARGE
			EndIf
		Default
      SHIL = #SHIL_SMALL
	EndSelect
	If SHGetSpecialFolderLocation_(0, CSIDL, @IconFile) = 0
		If OS >= #PB_OS_Windows_XP ; Pour Windows XP et plus, toute taille d'icône
			dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
			If dll_Shell32
				*Guid = ?IID_IImageList
				SHGetFileInfo_(IconFile, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_PIDL)
				hResult = CallFunction(dll_Shell32, "SHGetImageList", SHIL, *Guid, @ImageList.IImageList2)
				If hResult = 0
					ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
					ImageList\Release()
				EndIf
				CloseLibrary(dll_Shell32)
			EndIf
		Else ; Avant windows XP, icône 16*16 ou 32*32
			If SHIL = #SHIL_EXTRALARGE Or SHIL = #SHIL_LARGE
				SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_PIDL | #SHGFI_LARGEICON)
				hIcon = InfosFile\hIcon
			Else
				SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_PIDL | #SHGFI_SMALLICON)
				hIcon = InfosFile\hIcon
			EndIf
		EndIf
	EndIf
  ProcedureReturn hIcon
EndProcedure





;- Programme principal

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 800, 300, "Dossiers spéciaux", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0 Or CreateGadgetList(WindowID(0)) = 0
  End
EndIf

; On crée un liste
ListIconGadget(1, 0, 0, 800, 200, "Valeur", 60, #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(1, 1, "Nom", 150)
AddGadgetColumn(1, 2, "Adresse du dossier", 560)

; On liste tous les dossier systèmes récupérables
For n = 0 To 200
  Nom.s = GetSpecialFolderName2(n) ; On récupère le nom du dossier
  Adresse.s = GetSpecialFolderLocation2(n) ; On récupère l'adresse du dossier
  If Nom
    If Adresse = "" ; Affichage dans le debugger des dossiers
      Debug RSet(Str(n), 2, "0") + "     Pas de dossier, il s'agit de : " + Nom
    Else
      Debug RSet(Str(n), 2, "0") + "     " + Adresse
    EndIf
    AddGadgetItem(1, -1, Str(n) + Chr(10) + Nom + Chr(10) + Adresse) ; On affiche
  EndIf
Next

; On affiche l'icône du premier élément
SetGadgetState(1, 0) ; on sélectionne le premier élément
TextGadget(4, 5, 215, 200, 15, "Icône du dossier sélectionné :")
Icone16 = GetSpecialFolderIcon2(0, 16) ; en 16 * 16
Icone32 = GetSpecialFolderIcon2(0, 32) ; en 32 * 32
Icone48 = GetSpecialFolderIcon2(0, 32) ; en 48 * 48
ImageGadget(2, 5, 235, 16, 16,  Icone16) ; en 16 * 16
ImageGadget(3, 5 + 16 + 4, 235, 32, 32, Icone32) ; en 32 * 32
ImageGadget(4, 5 + 16 + 4 + 32 + 4, 235, 48, 48, Icone48) ; en 48 * 48

Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    Select EventGadget() ; Gadgets
      Case 1
        Select EventType()
          Case #PB_EventType_Change
            Position = GetGadgetState(1)
            If Position >= 0
              Valeur = Val(GetGadgetItemText(1, Position, 0))
							DestroyIcon_(Icone16)
							DestroyIcon_(Icone32)
							DestroyIcon_(Icone48)
							Icone16 = GetSpecialFolderIcon2(Valeur, 16)
							Icone32 = GetSpecialFolderIcon2(Valeur, 32)
							Icone48 = GetSpecialFolderIcon2(Valeur, 48)
              SetGadgetState(2, Icone16)
              SetGadgetState(3, Icone32)
							SetGadgetState(4, Icone48)
            EndIf
          Case #PB_EventType_LeftDoubleClick
            Position = GetGadgetState(1)
            If Position >= 0
              Debug GetGadgetItemText(1, Position, 2)
              RunProgram("explorer.exe", "/e,/n," + Chr(34) + GetGadgetItemText(1, Position, 2) + Chr(34), "")
            EndIf
        EndSelect
        
    EndSelect
  EndIf
  
Until Event = #PB_Event_CloseWindow

DestroyIcon_(Icone16)
DestroyIcon_(Icone32)
DestroyIcon_(Icone48)
End



; Voici la liste des valeurs obtenues sous Windows XP (Certaines valeurs n'ont pas de dossier sous d'autres version de Windows)

; 00     C:\Documents And Settings\Le Soldat Inconnu\Bureau\
; 01     Pas de dossier, il s'agit de : Internet Explorer
; 02     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\Programmes\
; 03     Pas de dossier, il s'agit de : Panneau de configuration
; 04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs
; 05     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\
; 06     C:\Documents And Settings\Le Soldat Inconnu\Favoris\
; 07     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\Programmes\Démarrage\
; 08     C:\Documents And Settings\Le Soldat Inconnu\Recent\
; 09     C:\Documents And Settings\Le Soldat Inconnu\SendTo\
; 10     Pas de dossier, il s'agit de : Corbeille
; 11     C:\Documents And Settings\Le Soldat Inconnu\Menu Démarrer\
; 13     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\Ma musique\
; 16     C:\Documents And Settings\Le Soldat Inconnu\Bureau\
; 17     Pas de dossier, il s'agit de : Poste de travail
; 18     Pas de dossier, il s'agit de : Favoris réseau
; 19     C:\Documents And Settings\Le Soldat Inconnu\Voisinage réseau\
; 20     C:\WINDOWS\Fonts\
; 21     C:\Documents And Settings\Le Soldat Inconnu\Modèles\
; 22     C:\Documents And Settings\All Users\Menu Démarrer\
; 23     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\
; 24     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\Démarrage\
; 25     C:\Documents And Settings\All Users\Bureau\
; 26     C:\Documents And Settings\Le Soldat Inconnu\Application Data\
; 27     C:\Documents And Settings\Le Soldat Inconnu\Voisinage D'impression\
; 28     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Application Data\
; 31     C:\Documents And Settings\All Users\Favoris\
; 32     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Temporary Internet Files\
; 33     C:\Documents And Settings\Le Soldat Inconnu\Cookies\
; 34     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Historique\
; 35     C:\Documents And Settings\All Users\Application Data\
; 36     C:\WINDOWS\
; 37     C:\WINDOWS\system32\
; 38     C:\Program Files\
; 39     C:\Documents And Settings\Le Soldat Inconnu\Mes Documents\Mes images\
; 40     C:\Documents And Settings\Le Soldat Inconnu\
; 41     C:\WINDOWS\system32\
; 43     C:\Program Files\Fichiers communs\
; 45     C:\Documents And Settings\All Users\Modèles\
; 46     C:\Documents And Settings\All Users\Documents\
; 47     C:\Documents And Settings\All Users\Menu Démarrer\Programmes\Outils D'administration\
; 49     Pas de dossier, il s'agit de : Connexions réseau
; 54     C:\Documents And Settings\All Users\Documents\Mes images\
; 56     C:\WINDOWS\Resources\
; 59     C:\Documents And Settings\Le Soldat Inconnu\Local Settings\Application Data\Microsoft\CD Burning\
; 61     Pas de dossier, il s'agit de : Réseau


; Voici la liste des valeurs obtenues sous Windows 98

; 00     C:\WINDOWS\Bureau\
; 01     Pas de dossier, il s'agit de : Internet explorer
; 02     C:\WINDOWS\Menu Démarrer\Programmes\
; 03     Pas de dossier, il s'agit de : Panneau de configuration
; 04     Pas de dossier, il s'agit de : Imprimantes et télécopieurs
; 05     C:\Mes documents\
; 06     C:\WINDOWS\Favoris\
; 07     C:\WINDOWS\Menu Démarrer\Programmes\Démarrage\
; 08     C:\WINDOWS\Recent\
; 09     C:\WINDOWS\SendTo\
; 10     Pas de dossier, il s'agit de : Corbeille
; 11     Menu Démarrer C:\WINDOWS\Menu Démarrer\
; 16     C:\WINDOWS\Bureau\
; 17     Pas de dossier, il s'agit de : Poste de travail
; 18     Pas de dossier, il s'agit de : Favoris réseau
; 19     C:\WINDOWS\Voisinage réseau\
; 20     C:\WINDOWS\FONTS\
; 21     C:\WINDOWS\ShellNew\
; 26     C:\WINDOWS\Application Data\
; 27     C:\WINDOWS\PrintHood\
; 32     C:\WINDOWS\Temporary Internet Files\
; 33     C:\WINDOWS\Cookies\
; 34     C:\WINDOWS\Historique\

Re: Dossier spéciaux de windows - Nom, Adresse et Icône

Publié : sam. 26/sept./2009 23:28
par Jacobus
Merci, ça fonctionne nickel en mega size sous Vista 8)
Quand je vois la date du premier jet, je me dis que le temps passe...

Re: Dossier spéciaux de windows - Nom, Adresse et Icône

Publié : dim. 27/sept./2009 9:14
par Kwai chang caine
Soldat...si personne l'a fait d'ici mardi.
Moi je veux bien donner le resultat W2000, quand je serais au boulot :wink: