ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

GetSpecialFolder **** toutes la gagne et y'en a un paquet enfin j'en ai ressencé 12287   



L'auteur

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

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0
VFP 3.0

Description
Salut à tous

voici la fonction que vous retrouverez si vous faites une recherche sur Google et j'ai eu de la difficulter à là trouver.

Procedure GetSpecialFolder(tnFolder)
Local lcSpecialFolderPath, ;
lcPath
lcSpecialFolderPath = replicate(chr(0), 260)

Declare SHGetSpecialFolderPath In shell32.Dll ;
long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , integer fCreate

SHGetSpecialFolderPath(0, @lcSpecialFolderPath, tnFolder, 0)

lcRetVal =
Strtran( lcSpecialFolderPath , Chr(0) ,'' )
Return iif(vartype(lcRetVal)="C",lcRetVal,"")

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
Close Tables all


TEXT to lsDef noshow

#Define CSIDL_PROGRAMS                 2   &&Program Groups Folder
#Define CSIDL_PERSONAL                 5   &&Personal Documents Folder
#Define CSIDL_FAVORITES                6   &&Favorites Folder
#Define CSIDL_STARTUP                  7   &&Startup Group Folder
#Define CSIDL_RECENT                   8   &&Recently Used Documents
#Define CSIDL_SENDTO                   9   &&Send To Folder
#Define CSIDL_STARTMENU                11  &&Start Menu Folder
#Define CSIDL_DESKTOPDIRECTORY         16  &&Desktop Folder
#Define CSIDL_NETHOOD                  19  &&Network Neighborhood Folder
#Define CSIDL_TEMPLATES                21  &&Document Templates Folder
#Define CSIDL_COMMON_STARTMENU         22  &&Common Start Menu Folder
#Define CSIDL_COMMON_PROGRAMS          23  &&Common Program Groups
#Define CSIDL_COMMON_STARTUP           24  &&Common Startup Group Folder
#Define CSIDL_COMMON_DESKTOPDIRECTORY  25  &&Common Desktop Folder
#Define CSIDL_APPDATA                  26  &&Application Data Folder
#Define CSIDL_PRINTHOOD                27  &&Printers Folder
#Define CSIDL_COMMON_FAVORITES         31  &&Common Favorites Folder
#Define CSIDL_INTERNET_CACHE           32  &&Temp. Internet Files Folder
#Define CSIDL_COOKIES                  33  &&Cookies Folder
#Define CSIDL_HISTORY                  34  &&History Folder

EndText


Local lcCsrDefName as String , i as integer

m.lcCsrDefName    = "csrDEF"

lsDef = Alltrim(Chrtran(Chrtran(lsDef,Chr(9),""),Chr(10),""))
Do while Space(2) $ lsDef

    lsDef = Strtran(lsDef,Space(2),Space(1))

enddo

lnDef = ALines(laDef,lsDef,1+4)
If File(m.lcCsrDefName+".dbf")
    Delete File (m.lcCsrDefName+."*")
endif

Create TABLE (m.lcCsrDefName) ( type c(8),def_name c(50),value c(10) , comment c(100), path c(200), lxp l, lseven l)

For i = 1 to lnDef

    Insert into (m.lcCsrDefName) values ;
        (    GetWordNum(laDef(i),1," ")    ;
        ,GetWordNum(laDef(i),2," ")    ;
        ,GetWordNum(laDef(i),3," ")    ;
        ,Substr(laDef(i),At(" " , laDef(i),4));
        , "" ;
        , .t. ;
        , .f. ;
        )

endfor
Index On Val(valuetag nValue

Local iDef as Integer , lcFolder as String

For iDef = 1 to 100000
    lcFolder = GetSpecialFolder(iDef)
    DO CASE
    CASE Empty(lcFolder) and Seek(iDef, m.lcCsrDefName ,"nValue")
        * vide et existe
        *     donc n'existe PAS sous SEVEN
        set step on

    Case Empty(lcFolder) and not Seek(iDef, m.lcCsrDefName ,"nValue")
        * vide et n'existe pas .... cette condion est bonne
        *    ne rien faire

    Case Not Empty(lcFolder) and Seek(iDef, m.lcCsrDefName ,"nValue")
        * bonne condition
        REPLACE    path WITH m.lcFolder

    Case  Not Empty(lcFolder) and  not Seek(iDef, m.lcCsrDefName ,"nValue")
        * définition exécutable seulement sous SEVEN
        * fonctionne sous SEVEN, à confirmer pour XP
        Insert INTO (m.lcCsrDefName) VALUES  ( "#DEFINE""" ,Transform( iDef ),"", lcFolder, .f..t. )

    OTHERWISE

    ENDCASE
endfor

Select(m.lcCsrDefName)
Browse nowait

Procedure GetSpecialFolder(tnFolder)
    Local lcSpecialFolderPath, ;
        lcPath
    lcSpecialFolderPath = Replicate(Chr(0), 260)

    Declare Integer SHGetSpecialFolderPath In shell32.Dll ;
        long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , Integer Fcreate

    lnErr =  SHGetSpecialFolderPath(0, @lcSpecialFolderPath, tnFolder, 0)

    ? m.tnFolder,lnErr

    lcRetVal = Strtran( lcSpecialFolderPath , Chr(0) ,'' )
    Return Iif(Vartype(lcRetVal)="C",lcRetVal,"")


    Declare Integer SHGetSpecialFolderPath In shell32.Dll ;
        long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , Integer Fcreate


    Return Iif(  SHGetSpecialFolderPath(0, @lcSpecialFolderPath, tnFolder, 0) == 0 ;
        ,    '' ;
        ,    Rtrim(m.lcSpecialFolderPath, 0, Chr(0)) ;
        )



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

endif






www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3