Lister toutes les cles du registre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Lister toutes les cles du registre

Message par julien »

Salut,

Comment feriez vous pour lister tous les clés (aussi dans les sous répertoire du registre) contenu dans le registre ?

Je ne vous pas comment faire !

(je voudrai faire comme le code de codArchiv qui liste tous les fichiers sur le HD, mais dans le registre !)

Merci :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

voir ce code
http://purebasic.hmt-forum.com/viewtopic.php?t=1024

prochedure ChargeRegistre()
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

j'ai pas tro compris ton code,

J'ai commencé ceci mais ça ne liste pas tout, il y'a plusieurs problèmes, mais je ne sais pas ou


Code : Tout sélectionner

Procedure liste_valeur(type_cle,sous_cle$)
Repeat
Debug ListRegKey(type_cle,sous_cle$,idx)
idx+1

 
Position = FindString(Result$,"=", 0)
clef_cours$=Left(Result$,Position-1)
;Debug GetRegKey(type_cle,sous_cle$,clef_cours$)
; If UCase(Left(GetRegKey(type_cle,sous_cle$,clef_cours$),3))=UCase("c:\")
; Debug GetRegKey(type_cle,sous_cle$,clef_cours$)
; 
; EndIf 

Until Result$=""

EndProcedure






Structure KeyList
    key.s
    parent.l             
EndStructure



NewList keys.KeyList ()


Procedure OpenKey (openkey, subkey$, flags)
    result = RegOpenKeyEx_ (openkey, subkey$, 0, flags, @handle)
    If result = #ERROR_SUCCESS
        ProcedureReturn handle
    EndIf
EndProcedure



Procedure CloseKey (handle)
    ProcedureReturn RegCloseKey_ (handle)
EndProcedure



Procedure EnumKeys (openkey)

    buffsize = 256
    buffer$ = Space (buffsize)
    result = RegEnumKeyEx_ (openkey, index, @buffer$, @buffsize, #NULL, #NULL, #NULL, @written.SYSTEMTIME)
   
    AddElement (keys ())
    keys ()\key = buffer$
    keys ()\parent = openkey
    index = index + 1
   
    If result = #ERROR_SUCCESS
   
        Repeat
       
                buffsize = 256
                buffer$ = Space (buffsize)
                result = RegEnumKeyEx_ (openkey, index, @buffer$, @buffsize, #NULL, #NULL, #NULL, @written.SYSTEMTIME)
               
                If result = #ERROR_SUCCESS
                    AddElement (keys ())
                    keys ()\key = buffer$
                    keys ()\parent = openkey
                EndIf
               
                index = index + 1
               
        Until result = #ERROR_NO_MORE_ITEMS
       
    EndIf
   
EndProcedure


Procedure EnumValues (openkey)

    buffsize = 1024
    buffer$ = Space (buffsize)
    vdsize = 1024
    valuedata$ = Space (vdsize)
    result = RegEnumValue_ (openkey, index, @buffer$, @buffsize, #NULL, #NULL, @valuedata$, @vdsize)
   
    If result = #ERROR_SUCCESS
       
        If buffer$ = ""
            buffer$ = "(Default)"
        EndIf
       
        Debug buffer$ + " -- " + valuedata$

        index = index + 1
       
        Repeat

            buffsize = 1024
            buffer$ = Space (buffsize)
            vdsize = 1024
            valuedata$ = Space (vdsize)
            result = RegEnumValue_ (openkey, index, @buffer$, @buffsize, #NULL, #NULL, @valuedata$, @vdsize)
       
            If result = #ERROR_SUCCESS
                If buffer$ = ""
                    buffer$ = "(Default)"
                EndIf
                Debug "--------> " + buffer$ + " -- " + valuedata$
            EndIf
       
            index = index + 1
           
        Until result = #ERROR_NO_MORE_ITEMS
       
    EndIf
   
EndProcedure





Procedure cherche(type_cle,sous_cle$)

key = OpenKey (type_cle,sous_cle$, #KEY_ALL_ACCESS)


If key

   
    EnumKeys(key)


    ResetList (keys ())
    While NextElement (keys ())
        If keys ()\parent = key    ; Not sure why I did this!
            New_sous_key$= keys ()\key
            Debug "Sous dossier-> "+New_sous_key$ 
            cherche(type_cle,sous_cle$+"\"+New_sous_key$)
          
            
            liste_valeur(type_cle,sous_cle$+"\"+New_sous_key$)     ; List each key in turn...
         
       
        EndIf
    Wend
     ;
;DeleteElement (keys ())
    CloseKey (key) ; Close main key...

EndIf



EndProcedure


cherche(#HKEY_local_machine, "software\")
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Essaye ça Julien et tu laisse les variables Global lpcchName &
Global lpszName$ là ou elles sont.

Sur ma bécane, ça prend environ 12 à 15 secondes pour que l'affichage soit terminé pour la clée HKEY_local_machine\software

Cette clée ne rentre pas dans le décompte final affiché en bas de la fenêtre.

Normalement à chaque appel de la procédure Enumere_clees(), la variable iSubkey doit être à 0 mais j'ai mis cette ligne en commentaire car pb met toutes les variables locales à 0 au début de la procédure donc à chaque fois qu'elle est appelée.

Code : Tout sélectionner

;- Declaration
Global lpcchName
Global lpszName$

Global Nb_Clees

;- Procedures
Procedure Enumere_clees(type_cle, sous_cle$)
   Protected Enum, hKey, iSubkey
   If RegOpenKeyEx_(type_cle, sous_cle$ + "\", 0, #KEY_ENUMERATE_SUB_KEYS, @hKey) = #ERROR_SUCCESS
      ; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
      ; incémenté de 1 à chaque tour de boucle
      lpcchName = 256 ; variable indiquant la taille max de la chaine
      lpszName$ = Space(lpcchName) ; initialisation de la chaine qui récupère la SubKey
      Enum = RegEnumKeyEx_(hKey, iSubkey, @lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
      
      While Enum <> #ERROR_NO_MORE_ITEMS
         iSubkey + 1 ; on incrémente le compteur d'énumération
         B$= sous_cle$ + "\" + lpszName$
         AddGadgetItem(1, -1, B$)
         Nb_Clees + 1
         SetGadgetText(3, Str(Nb_Clees))
         UpdateWindow_(GadgetID(1))
         Enumere_clees(type_cle, B$)  ; appel récursif de la procédure)
         Enum = RegEnumKeyEx_(hKey, iSubkey, lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
      Wend
      RegCloseKey_(hKey)
   EndIf
   
   
   
EndProcedure

;- Programme principal
If OpenWindow(0, 100, 150, 600, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - Enumération des clées du registre")
   If CreateGadgetList(WindowID())
      ListViewGadget(1, 0, 0, 598, 380)
      TextGadget(2, 30, 384, 200, 20, "Nombre de clées et sous-clées : ")
      TextGadget(3, 190, 384, 80, 20, "")
      UpdateWindow_(GadgetID(2))
      UpdateWindow_(GadgetID(3))
      If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...")
         UpdateWindow_(GadgetID(1))
          Enumere_clees(#HKEY_local_machine, "software")
         CloseWindow(1)
      EndIf
      
      ;- Boucle evenements
      Repeat
         Select WaitWindowEvent()
            Case #WM_CLOSE
               Quit + 1
         EndSelect
      Until Quit
      
   EndIf
EndIf

End
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Un très grand merci à vous, Denis ton code est super propre ! :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci Julien.

J'ai mis la variable lpcchName à 256 mais je n'ai pas regardé la doc MS concernant la taille max retournée par pour une subkey.

Sinon l'affichage prend pas mal de temps et si on utilise une listicon c'est encore pire.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

en mode debug ça prend trop de temps, mais une fois en *.exe c ok :wink:
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Par contre il n'est pas possible d'accéder à la racine du registre.

Comment faire pour lister les 'dossiers' de la branche HKEY_USERS ?

ça ne me revoie pas les dossiers du style : S-1-5-21-842925246-1993962763-725345543-1003
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Avec beaucoup de retard je viens de voir ton dernier post Julien.

Tu as un code d'exemple pour que je teste ?

Merci


Denis
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Merci, par exemple avec ton code de plus haut ça ne amrche pas si on ne connait pas le dossier

Code : Tout sélectionner

;- Declaration
Global lpcchName
Global lpszName$

Global Nb_Clees

;- Procedures
Procedure Enumere_clees(type_cle, sous_cle$)
   Protected Enum, hKey, iSubkey
   If RegOpenKeyEx_(type_cle, sous_cle$ + "\", 0, #KEY_ENUMERATE_SUB_KEYS, @hKey) = #ERROR_SUCCESS
      ; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
      ; incémenté de 1 à chaque tour de boucle
      lpcchName = 256 ; variable indiquant la taille max de la chaine
      lpszName$ = Space(lpcchName) ; initialisation de la chaine qui récupère la SubKey
      Enum = RegEnumKeyEx_(hKey, iSubkey, @lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
     
      While Enum <> #ERROR_NO_MORE_ITEMS
         iSubkey + 1 ; on incrémente le compteur d'énumération
         B$= sous_cle$ + "\" + lpszName$
         AddGadgetItem(1, -1, B$)
         Nb_Clees + 1
         SetGadgetText(3, Str(Nb_Clees))
         UpdateWindow_(GadgetID(1))
         Enumere_clees(type_cle, B$)  ; appel récursif de la procédure)
         Enum = RegEnumKeyEx_(hKey, iSubkey, lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
      Wend
      RegCloseKey_(hKey)
   EndIf
   
   
   
EndProcedure

;- Programme principal
If OpenWindow(0, 100, 150, 600, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - Enumération des clées du registre")
   If CreateGadgetList(WindowID())
      ListViewGadget(1, 0, 0, 598, 380)
      TextGadget(2, 30, 384, 200, 20, "Nombre de clées et sous-clées : ")
      TextGadget(3, 190, 384, 80, 20, "")
      UpdateWindow_(GadgetID(2))
      UpdateWindow_(GadgetID(3))
      If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...")
         UpdateWindow_(GadgetID(1))
          Enumere_clees(#HKEY_local_machine, "")
         CloseWindow(1)
      EndIf
     
      ;- Boucle evenements
      Repeat
         Select WaitWindowEvent()
            Case #WM_CLOSE
               Quit + 1
         EndSelect
      Until Quit
     
   EndIf
EndIf

End
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est normal puisque dans la procedure Enumere_clees(type_cle, sous_cle$) l'API utilisée RegOpenKeyEx_ ouvre une sous-clée spécifique, or dans ton exemple la chaine est vide et celle passée en paramètre à l'API est "\"

Je vais regarder si je peut trouver une solution
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Si j'ai bien compris, tu ne souhaite que les dossiers de la racine sans avoir les sous-clées ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ce code devrait aller

Code : Tout sélectionner

;- Procedures 
Procedure Enumere_clees(type_cle) 
   Protected Enum, hKey, iSubkey 
      ; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey 
      ; incémenté de 1 à chaque tour de boucle 
      lpcchName = 256 ; variable indiquant la taille max de la chaine 
      lpszName$ = Space(lpcchName) ; initialisation de la chaine qui récupère la SubKey 
      Enum =  RegEnumKeyEx_(type_cle, 0, @lpszName$, @lpcchName.l, 0, 0, 0, @lpftLastWrite.l )
      While Enum = #ERROR_SUCCESS
         AddGadgetItem(1, -1, lpszName$) 
         UpdateWindow_(GadgetID(1))
         Nb_Clees + 1 
         SetGadgetText(3, Str(Nb_Clees)) 
         iSubkey + 1 ; on incrémente le compteur d'énumération 
         lpcchName = 256 ; variable indiquant la taille max de la chaine 
         Enum = RegEnumKeyEx_(type_cle, iSubkey, @lpszName$, @lpcchName.l, 0, 0, 0, @lpftLastWrite.l )
      Wend 
EndProcedure 

;- Programme principal 
If OpenWindow(0, 100, 150, 600, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - Enumération des clées du registre") 
   If CreateGadgetList(WindowID()) 
      ListViewGadget(1, 0, 0, 598, 380) 
      TextGadget(2, 30, 384, 200, 20, "Nombre de clées : ") 
      TextGadget(3, 190, 384, 80, 20, "") 
      UpdateWindow_(GadgetID(2)) 
      UpdateWindow_(GadgetID(3)) 
      If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...") 
         UpdateWindow_(GadgetID(1)) 
;          Enumere_clees(#HKEY_local_machine) 
          Enumere_clees(#HKEY_users) 
         CloseWindow(1) 
      EndIf 
      
      ;- Boucle evenements 
      Repeat 
         Select WaitWindowEvent() 
            Case #WM_CLOSE 
               Quit + 1 
         EndSelect 
      Until Quit 
      
   EndIf 
EndIf 

End
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Denis a écrit :Si j'ai bien compris, tu ne souhaite que les dossiers de la racine sans avoir les sous-clées ?
Pas tout à fait puisque je souhaite lister toute les clef à partir de la racine du registre. Comme avec le disque dur, c'est à dire lister tous les fichiers du lecteur C:\.

Merçi pour ton aide et ton code, ça me sera vraiment utile, et je ne pense pas être le seul ! :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ok, je vais adapter les 2 codes pouir n'en faire qu'un qui fonctionne dans les 2 cas.

Demain je pense
Répondre