Newsgroup: it.comp.lang.visual-basic
Titolo: Come leggere il registro di sistema riga per riga

Ciao a tutti,
riporto qui sotto il modulo scaricato dal sito comune che consente di
leggere e scrivere facilmente il registro di sistema...
Funziona egregiamente, solo che non riesco ad effettuare l'operazione di
lettura delle chiavi una ad una.
Quello che mi interessa fare è entrare un una determinata chiave e leggere
tutti i valori impostati al suo interno uno ad uno; forse con un esempio
sono più chiaro.
Dentro il registro c'è la sequente chiave:
HKEY_LOCAL_MACHINE\SOFTWARE\PROVA\SOTTOPROVA\
dentro sono impostati i seguenti valori
Valore1 = "Ciao1"
Valore2 = "Ciao2"
Valore3 = "Ciao3"
....
Valore 200 = "Ciao200"
....
ecc.
Se devo leggere un singolo valore (ad esempio il 3) attualmente faccio:
a = EmiLeggiChiaveStringa("HKEY_LOCAL_MACHINE\SOFTWARE\EMI\R9\", "Valore3",
"")
Ma se non conosco il nomi dei valori (Valore1, Valore2, Valore3) e non so
quanti sono come faccio a scorrerli uno ad uno.
Spero che qualcuno di voi sia in grado di aiutarmi, ringrazio tutti in
anticipo.
Ciao da Emiliano
Option Explicit
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const HKEY_PERFORMANCE_DATA = &H80000004
Private Const HKEY_CURRENT_CONFIG = &H80000005
Private Const HKEY_DYN_DATA = &H80000006
Private Const REG_OPTION_NON_VOLATILE = 0&
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_ALL_ACCESS = &H3F
Private Const ERROR_SUCCESS = 0&
Private Const REG_SZ = 1&
Private Const REG_BINARY = 3&
Private Const REG_DWORD = 4&
Private Declare Function RegCreateKeyEx _
      Lib "advapi32.dll" Alias "RegCreateKeyExA" _
      (ByVal hKey As Long, _
      ByVal lpSubKey As String, _
      ByVal Reserved As Long, _
      ByVal lpClass As String, _
      ByVal dwOptions As Long, _
      ByVal samDesired As Long, _
      lpSecurityAttributes As Long, _
      phkResult As Long, _
      lpdwDisposition As Long) As Long
Private Declare Function RegDeleteKey _
      Lib "advapi32.dll" Alias "RegDeleteKeyA" _
      (ByVal hKey As Long, _
      ByVal lpSubKey As String) As Long
Private Declare Function RegOpenKeyEx _
      Lib "advapi32.dll" Alias "RegOpenKeyExA" _
      (ByVal hKey As Long, _
      ByVal lpSubKey As String, _
      ByVal ulOptions As Long, _
      ByVal samDesired As Long, _
      phkResult As Long) As Long
Private Declare Function RegCloseKey _
      Lib "advapi32.dll" _
      (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueEx _
      Lib "advapi32.dll" Alias "RegQueryValueExA" _
      (ByVal hKey As Long, _
      ByVal lpValueName As String, _
      ByVal lpReserved As Long, _
      lpType As Long, _
      lpData As Any, _
      lpcbData As Long) As Long
      'Note that if you declare the lpData parameter as String, you must
pass it ByVal.
Private Declare Function RegSetValueEx _
      Lib "advapi32.dll" Alias "RegSetValueExA" _
      (ByVal hKey As Long, _
      ByVal lpValueName As String, _
      ByVal Reserved As Long, _
      ByVal dwType As Long, _
      lpData As Any, _
      ByVal cbData As Long) As Long
      'Note that if you declare the lpData parameter as String, you must
pass it ByVal.
Private Declare Function RegDeleteValue _
      Lib "advapi32.dll" Alias "RegDeleteValueA" _
      (ByVal hKey As Long, _
      ByVal lpValueName As String) As Long
Private Function TrovaBase(ByRef Nome As String) As Long
'Restituisce il codice relativo al ramo principale della chiave
   Dim Base As String
   Base = UCase$(Left$(Nome, InStr(Nome, "\") - 1))
   Nome = Mid$(Nome, InStr(Nome, "\") + 1)
   Select Case Base
   Case "HKEY_CLASSES_ROOT": TrovaBase = HKEY_CLASSES_ROOT
   Case "HKEY_CURRENT_USER": TrovaBase = HKEY_CURRENT_USER
   Case "HKEY_LOCAL_MACHINE": TrovaBase = HKEY_LOCAL_MACHINE
   Case "HKEY_USERS": TrovaBase = HKEY_USERS
   Case "HKEY_PERFORMANCE_DATA": TrovaBase = HKEY_PERFORMANCE_DATA
   Case "HKEY_CURRENT_CONFIG": TrovaBase = HKEY_CURRENT_CONFIG
   Case "HKEY_DYN_DATA": TrovaBase = HKEY_DYN_DATA
   Case Else: TrovaBase = &H88888888   'Valore non valido
   End Select
End Function
Public Function CreaChiave(ByVal Nome As String) As Boolean
'Crea una nuova chiave (o la apre se già esiste) e imposta il suo codice
   Dim Chiave As Long
   Dim Base As Long
   Dim Ris As Long
   Base = TrovaBase(Nome)
   CreaChiave = (RegCreateKeyEx(Base, Nome, 0&, vbNullString,
REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, ByVal 0&, Chiave, Ris) =
ERROR_SUCCESS)
   If CreaChiave Then CreaChiave = ChiudiChiave(Chiave)
End Function
Public Function CancellaChiave(ByVal Nome As String) As Boolean
'Elimina una chiave
   Dim Base As Long
   Base = TrovaBase(Nome)
   CancellaChiave = (RegDeleteKey(Base, Nome) = ERROR_SUCCESS)
End Function
Private Function ApriChiave(ByVal Nome As String, ByRef hChiave As Long,
ByVal Accesso As Long) As Boolean
'Apre una chiave e imposta il suo codice
   Dim Base As Long
   Base = TrovaBase(Nome)
   ApriChiave = (RegOpenKeyEx(Base, Nome, 0&, Accesso, hChiave) =
ERROR_SUCCESS)
End Function
Private Function ChiudiChiave(ByVal hChiave As Long) As Boolean
'Chiude una chiave dato il codice
   ChiudiChiave = (RegCloseKey(hChiave) = ERROR_SUCCESS)
End Function
Public Function LeggiChiaveStringa(ByVal Chiave As String, ByVal Nome As
String, ByRef Valore As String, Optional ByVal Default As String = "") As
Boolean
'Legge una stringa dalla chiave specificata, se non ci riesce restituisce il
valore di dafault
   Dim hChiave As Long
   Dim Dimensione As Long
   Dim Tipo As Long
   LeggiChiaveStringa = False
   If ApriChiave(Chiave, hChiave, KEY_QUERY_VALUE) Then
      If (RegQueryValueEx(hChiave, Nome, 0&, Tipo, ByVal 0&, Dimensione) =
ERROR_SUCCESS) And (Tipo = REG_SZ) Then
         Valore = Space$(Dimensione)
         If RegQueryValueEx(hChiave, Nome, 0&, ByVal 0&, ByVal Valore,
Dimensione) = ERROR_SUCCESS Then
            Valore = Left$(Valore, InStr(Valore, Chr(0)) - 1)
            LeggiChiaveStringa = True
         End If
      End If
      ChiudiChiave hChiave
   End If
   If Not LeggiChiaveStringa Then Valore = Default
End Function
Public Function EmiLeggiChiaveStringa(ByVal Chiave As String, ByVal Nome As
String, ByRef Valore As String, Optional ByVal Default As String = "") As
String
'Legge una stringa dalla chiave specificata, se non ci riesce restituisce il
valore di dafault
   Dim hChiave As Long
   Dim Dimensione As Long
   Dim Tipo As Long
   EmiLeggiChiaveStringa = False
   If ApriChiave(Chiave, hChiave, KEY_QUERY_VALUE) Then
      If (RegQueryValueEx(hChiave, Nome, 0&, Tipo, ByVal 0&, Dimensione) =
ERROR_SUCCESS) And (Tipo = REG_SZ) Then
         Valore = Space$(Dimensione)
         If RegQueryValueEx(hChiave, Nome, 0&, ByVal 0&, ByVal Valore,
Dimensione) = ERROR_SUCCESS Then
            Valore = Left$(Valore, InStr(Valore, Chr(0)) - 1)
            EmiLeggiChiaveStringa = Valore
         End If
      End If
      ChiudiChiave hChiave
   End If
End Function
Public Function LeggiChiaveBinario(ByVal Chiave As String, ByVal Nome As
String, ByRef Valore() As Byte) As Boolean
'Legge un valore binario dalla chiave specificata, se non ci riesce
restituisce il valore di dafault
   Dim hChiave As Long
   Dim Dimensione As Long
   Dim Tipo As Long
   LeggiChiaveBinario = False
   If ApriChiave(Chiave, hChiave, KEY_QUERY_VALUE) Then
      If (RegQueryValueEx(hChiave, Nome, 0&, Tipo, ByVal 0&, Dimensione) =
ERROR_SUCCESS) And (Tipo = REG_BINARY) Then
         ReDim Valore(0 To Dimensione - 1)
         LeggiChiaveBinario = (RegQueryValueEx(hChiave, Nome, 0&, ByVal 0&,
Valore(0), Dimensione) = ERROR_SUCCESS)
      End If
      ChiudiChiave hChiave
   End If
End Function
Public Function LeggiChiaveNumero(ByVal Chiave As String, ByVal Nome As
String, ByRef Valore As Long, Optional ByVal Default As Long = 0) As Boolean
'Legge un numero dalla chiave specificata, se non ci riesce restituisce il
valore di dafault
   Dim hChiave As Long
   Dim Tipo As Long
   LeggiChiaveNumero = False
   If ApriChiave(Chiave, hChiave, KEY_QUERY_VALUE) Then
      LeggiChiaveNumero = ((RegQueryValueEx(hChiave, Nome, 0&, Tipo, Valore,
4) = ERROR_SUCCESS) And (Tipo = REG_DWORD))
      ChiudiChiave hChiave
   End If
   If Not LeggiChiaveNumero Then Valore = Default
End Function
Public Function ScriviChiaveStringa(ByVal Chiave As String, ByVal Nome As
String, ByVal Valore As String, Optional ByVal Default As String = "") As
Boolean
'Scrive una stringa nella chiave se il suo valore è diverso da quello di
default, altrimenti cancella la stringa dalla chiave
   Dim hChiave As Long
   ScriviChiaveStringa = False
   If ApriChiave(Chiave, hChiave, KEY_SET_VALUE) Then
      If Valore <> Default Then
         ScriviChiaveStringa = (RegSetValueEx(hChiave, Nome, 0&, REG_SZ,
ByVal Valore, LenB(StrConv(Valore, vbFromUnicode)) + 1) = ERROR_SUCCESS)
      Else
         ScriviChiaveStringa = CancellaValore(hChiave, Nome)
      End If
      ChiudiChiave hChiave
   End If
End Function
Public Function ScriviChiaveBinario(ByVal Chiave As String, ByVal Nome As
String, ByRef Valore() As Byte) As Boolean
'Scrive un valore binario nella chiave
   Dim hChiave As Long
   Dim Dimensione As Long
   ScriviChiaveBinario = False
   If ApriChiave(Chiave, hChiave, KEY_SET_VALUE) Then
      Dimensione = UBound(Valore) - LBound(Valore) + 1
      ScriviChiaveBinario = (RegSetValueEx(hChiave, Nome, 0&, REG_BINARY,
Valore(0), Dimensione) = ERROR_SUCCESS)
      ChiudiChiave hChiave
   End If
End Function
Public Function ScriviChiaveNumero(ByVal Chiave As String, ByVal Nome As
String, ByVal Valore As Long, Optional ByVal Default As Long = 0) As Boolean
'Scrive un numero nella chiave se il suo valore è diverso da quello di
default, altrimenti cancella il numero dalla chiave
   Dim hChiave As Long
   ScriviChiaveNumero = False
   If ApriChiave(Chiave, hChiave, KEY_SET_VALUE) Then
      If Valore <> Default Then
         ScriviChiaveNumero = (RegSetValueEx(hChiave, Nome, 0&, REG_DWORD,
Valore, 4) = ERROR_SUCCESS)
      Else
         ScriviChiaveNumero = CancellaValore(hChiave, Nome)
      End If
      ChiudiChiave hChiave
   End If
End Function
Private Function CancellaValore(ByVal hChiave As Long, ByVal Nome As String)
As Boolean
'Cancella un valore (stringa o numero) da una chiave
   CancellaValore = (RegDeleteValue(hChiave, Nome) = ERROR_SUCCESS)
End Function

da me, nella pagina degli esempi vb...
-> GbC
http://www.gbcweb.com

 
http://www.gbcweb.com
GbC, porca pupattola, ti fai vedere ogni morte di vescovo (chi č passato a
miglior vita, oggi?)
La lampadina, fammi accendere la lampadina a 220V.

we :-)
sono stato superoccupato...
no, di più...
quello che ho fatto lo vedi qui:
www.cashsystemsrl.com
ciao bello :)
-> GbC
http://www.gbcweb.com
PS: ora ti accendo tutte lampadine della città...

 ciao bello :)
Ok, ... il giro pare sia già partito.
Un sentiero, una dritta, persino una mappetta corsara...?

> no, di più...
E ... LdB? :-P

 ha scritto nel messaggio
news:Uinza.25567$Ny5.7...@twister2.libero.it...
