Lister toutes les cles du registre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Le voici

Pour énumérer une clée particulière, on appelle la procédure

Code : Tout sélectionner

Enumere_clees(#HKEY_users, "")
avec le second paramètre valant la chaine de la clée, le 1er paramètre étant une des 5 clées du registre.

Si on veut énumérer l'ensemble des clées d'une des 5 clées, le second paramètre doit être une chaine vide


Code : Tout sélectionner

;- Declaration
Global lpcchName
Global lpszName$

Global Nb_Clees
Global Nb_Sous_Clees

;- Procedures

Procedure Enumere_Sous_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$)
      UpdateWindow_(GadgetID(1))
      Nb_Sous_Clees + 1
      SetGadgetText(5, Str(Nb_Sous_Clees))
      Enumere_Sous_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


Procedure Enumere_clees(type_cle, sous_cle$)
  Protected Enum, hKey, iSubkey
  ; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
  ; incémenté de 1 à chaque tour de boucle
  If Len(sous_cle$) = 0 ; on énumère tout
    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))
      Enumere_Sous_clees(type_cle, lpszName$)
      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
  Else  ; on énumère seulement les sous-clées de la clée passée en paramètre
    SetGadgetText(3, "1")  ; on affiche qu'il n'y a qu'une clée
    Enumere_Sous_clees(type_cle, sous_cle$) ; et on énumère
  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, 90, 20, "Nombre de clées : ")
    TextGadget(3, 130, 384, 80, 20, "")

    TextGadget(4, 280, 384, 115, 20, "Nombre de sous-clées : ")
    TextGadget(5, 400, 384, 80, 20, "")
    If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...")
    ;   Enumere_clees(#HKEY_local_machine,"SYSTEM")
    ;  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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Extrait de la doc MSDK :

La Taille maxi pour un nom de clée est de 255 caractères
La Taille maxi pour un nom de valeur est comme ceci :
Windows XP, Windows .NET Server 2003 family: 16383 caractères

--> Windows 2000: 260 caractères ANSI ou 16383 caractères Unicode.

--> Windows 95/98/Me: 255 caractères
les valeurs longues (plus de 2048 octets) doivent être stockées
sous la forme de fichiers avec le nom de fichier stocké dans le
registre; cela permet de meilleures performances pour le registre.

La taille maxi pour une valeur est comme ceci :
--> Windows NT/2000/XP: Mémoire disponible
--> Windows 95/98/Me: 16300 octets.
Il y a une limite de 64 Ko pour la taille totale de toutes les valeurs d'une clée.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Merci pour ton code et ton aide, ça me sera vraiement utile !
:wink:
Répondre