Page 1 sur 2
Lister toutes les cles du registre
Publié : lun. 02/août/2004 14:35
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

Publié : mar. 03/août/2004 18:24
par Le Soldat Inconnu
Publié : mar. 03/août/2004 22:07
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\")
Publié : mer. 04/août/2004 16:31
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
Publié : mer. 04/août/2004 22:27
par julien
Un très grand merci à vous, Denis ton code est super propre !

Publié : jeu. 05/août/2004 6:28
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.
Publié : jeu. 05/août/2004 13:43
par julien
en mode debug ça prend trop de temps, mais une fois en *.exe c ok

Publié : jeu. 12/août/2004 16:51
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
Publié : lun. 20/sept./2004 18:01
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
Publié : mar. 21/sept./2004 16:54
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
Publié : mar. 21/sept./2004 18:13
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
Publié : mar. 21/sept./2004 18:21
par Anonyme2
Si j'ai bien compris, tu ne souhaite que les dossiers de la racine sans avoir les sous-clées ?
Publié : mar. 21/sept./2004 18:50
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
Publié : mar. 21/sept./2004 19:01
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 !

Publié : mar. 21/sept./2004 19:05
par Anonyme2
Ok, je vais adapter les 2 codes pouir n'en faire qu'un qui fonctionne dans les 2 cas.
Demain je pense