eddymaue Canada Membre Simple # 0000000075 enregistré le 26/10/2004 Maue Eddy j8j 8j8 Gatineau de la société Formatek Fiche personnelle
Note des membres 19/20 1 vote
Contributions > 01 - PRG : Programmation
GetSpecialFolder **** toutes la gagne et y'en a un paquet enfin j'en ai ressencé 12287
# 0000000762
ajouté le 15/06/2010 04:56:01 et modifié le 23/06/2010
consulté 8723 fois
Niveau
débutant
Moi ce que je cherchais c'était le 28ieme item de cette fonction soit : %userprofile%\AppData\Local
simplement ou sont enregistré les données et préférences de la majorité des logiciels que nous installons.
je joins une routine qui vous permettras de découvrir une multitude d'autres dossiers spéciaux, qui, je le crois, vous permetteront de mieux comprendre la structure de Windows en matière de dossiers.
À vous d'adapter ce code pour savoir ceux qui n'existe pas sous Xp, moi je n'ai plus rien qui roule sous Xp.
a+ aller have fun Le mouton noir d'Atoufox ... moi même le québécois Eddy
Code source :
*** Define Special Folder Constants
*** Ce sont ceux qui sont connus. Bon c'est ce que j'ai trouver avec Google CloseTablesall
For iDef = 1 to 100000
lcFolder = GetSpecialFolder(iDef) DOCASE CASEEmpty(lcFolder) andSeek(iDef, m.lcCsrDefName ,"nValue") * vide et existe * donc n'existe PAS sous SEVEN setstepon
CaseEmpty(lcFolder) andnotSeek(iDef, m.lcCsrDefName ,"nValue") * vide et n'existe pas .... cette condion est bonne * ne rien faire
le 16/06/2010, Gregory Adam a écrit : (1) Faut remplacer 255 par 260 http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/74f8b64e-7844-4442-997d-79477004322d
http://support.microsoft.com/kb/252652
(2) Faut ajouter un autre parametre integer a la declaration et declarer comme integer http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx
Declare integer SHGetSpecialFolderPath In shell32.Dll ; long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , integer create
(3) Space(255) Doit etre replicate(chr(0), 260)
(4) il faut tester la valeur de retour
if( empty(SHGetSpecialFolderPath(...)) ) cela n'existe pas
(5) chez toi, il reste un chr(0) apres le alltrim Faut faire un rtrim(lcSpecialFolderPath, 0, chr(0))
le 16/06/2010, eddymaue a écrit : merci Greg, j'ai completé les modifs sauf que j'ai préférer Strtr() pour rester compatible avec les versions 3 à 9
tester si c'est empty , c'est une question de goût et je préfère faire le teste à l'extérieur de la fonction.
Il reste une petite question. Pourquoi la Dll fonctionne même s'il me manquait un paramêtre lors de la déclaration ?
le 17/06/2010, Gregory Adam a écrit : >> tester si c'est empty , c'est une question de goût et je préfère faire le teste à l'extérieur de la fonction.
Ce n'est pas tres correcte - il y a une valeur de retour
>>Il reste une petite question. Pourquoi la Dll fonctionne même s'il me manquait un paramêtre lors de la déclaration ?
Les parametres sont passes sur le stack. La fonction n'a aucun moyen de savoir combien de parametres sont passes. Alors elle prendra une valeur qui est sur le stack - mais que tu n'as pas passee
Pour comprendre comment ca marche - tu regarderas ici http://en.wikipedia.org/wiki/X86_calling_conventions
le 18/06/2010, FoxInCloud (Th. Nivelet) a écrit : Félicitations Eddy, beau boulot, très utile et instructif @ + et j'espère aux prochaines Rencontres thn
le 19/06/2010, eddymaue a écrit : Merci Thierry et Greg j'ai compris.... au moins m'assurer que la valeur de retour est caractère
a+
le 23/06/2010, Gregory Adam a écrit : >> Greg j'ai compris.... au moins m'assurer que la valeur de retour est caractère
Non, il faut tester la valeur de retour de SHGetSpecialFolderPath()
Pour cela il faut d'abord la declarer comme il le faut - elle retourne 0 s'il y a un probleme
Declare INTEGER SHGetSpecialFolderPath In shell32.Dll ; long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , integer fcreate
Puis a l'appel
if( empty(SHGetSpecialFolderPath(...)) ) il y a un probleme return '' else return rtrim(m.lcSpecialFolderPath, 0, chr(0))
(1) Faut remplacer 255 par 260
http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/74f8b64e-7844-4442-997d-79477004322d
http://support.microsoft.com/kb/252652
(2) Faut ajouter un autre parametre integer a la declaration
et declarer comme integer
http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx
Declare integer SHGetSpecialFolderPath In shell32.Dll ;
long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , integer create
(3) Space(255)
Doit etre replicate(chr(0), 260)
(4) il faut tester la valeur de retour
if( empty(SHGetSpecialFolderPath(...)) )
cela n'existe pas
(5) chez toi, il reste un chr(0) apres le alltrim
Faut faire un
rtrim(lcSpecialFolderPath, 0, chr(0))