Dossier spéciaux de windows - Nom, Adresse et Icône
Publié : mer. 01/déc./2004 19:33
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
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
(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...
voila le code avec un exemple :
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.
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

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
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


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...

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\
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.