Newsgroup: it.comp.lang.visual-basic
Titolo: Ecco come si accede al registro di configurazione per leggere

Ciao!
Navigo da tempo nel NG ed ho notato che molti hanno bisogno di sapere come
si accede al registro di configurazione di Windows.
É per questo che ho deciso di mettere il contenuto di un modulo che
inserisco nei progetti in cui devo accedere al registro. Questo modulo non è
fatto da me, ma l'ho ricavato da applicazioni di esempio fatte dalla
Microsoft, e purtroppo con questo si può solo leggere e non scrivere.
Alla fine del listato inserisco la spiegazione.
Mi scuso se così la lettera è lunga, ma era l'unico modo.
---------- INIZIO LISTATO FILE ----------
Option Explicit
Public Const READ_CONTROL = &H20000
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
                       KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
                       KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_DYN_DATA = &H80000006
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_USERS = &H80000003
Public Const ERROR_SUCCESS = 0
Public Const REG_SZ = 1
Public Const REG_DWORD = 4
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA"
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long,
ByVal samDesired As Long, ByRef phkResult As Long) As Long
Public Declare Function RegQueryValueEx Lib "advapi32" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef
lpcbData As Long) As Long
Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As
Long
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As
String, ByRef KeyVal As String) As Boolean
    Dim i As Long                                           ' Loop Counter
    Dim rc As Long                                          ' Return Code
    Dim hKey As Long                                        ' Handle To An
Open Registry Key
    Dim hDepth As Long                                      '
    Dim KeyValType As Long                                  ' Data Type Of A
Registry Key
    Dim tmpVal As String                                    ' Tempory
Storage For A Registry Key Value
    Dim KeyValSize As Long                                  ' Size Of
Registry Key Variable
    '------------------------------------------------------------
    ' Open RegKey Under KeyRoot {HKEY_LOCAL_MACHINE...}
    '------------------------------------------------------------
    rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Open
Registry Key
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle
Error...
    tmpVal = String$(1024, 0)                             ' Allocate
Variable Space
    KeyValSize = 1024                                       ' Mark Variable
Size
    '------------------------------------------------------------
    ' Retrieve Registry Key Value...
    '------------------------------------------------------------
    rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
                         KeyValType, tmpVal, KeyValSize)    ' Get/Create Key
Value
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle Errors
    If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then           ' Win95 Adds
Null Terminated String...
        tmpVal = Left(tmpVal, KeyValSize - 1)               ' Null Found,
Extract From String
    Else                                                    ' WinNT Does NOT
Null Terminate String...
        tmpVal = Left(tmpVal, KeyValSize)                   ' Null Not
Found, Extract String Only
    End If
    '------------------------------------------------------------
    ' Determine Key Value Type For Conversion...
    '------------------------------------------------------------
    Select Case KeyValType                                  ' Search Data
Types...
    Case REG_SZ                                             ' String
Registry Key Data Type
        KeyVal = tmpVal                                     ' Copy String
Value
    Case REG_DWORD                                          ' Double Word
Registry Key Data Type
        For i = Len(tmpVal) To 1 Step -1                    ' Convert Each
Bit
            KeyVal = KeyVal + Hex(Asc(Mid(tmpVal, i, 1)))   ' Build Value
Char. By Char.
        Next
        KeyVal = Format$("&h" + KeyVal)                     ' Convert Double
Word To String
    End Select
    GetKeyValue = True                                      ' Return Success
    rc = RegCloseKey(hKey)                                  ' Close Registry
Key
    Exit Function                                           ' Exit
GetKeyError:      ' Cleanup After An Error Has Occured...
    KeyVal = ""                                             ' Set Return Val
To Empty String
    GetKeyValue = False                                     ' Return Failure
    rc = RegCloseKey(hKey)                                  ' Close Registry
Key
End Function
---------- FINE LISTATO FILE ----------
Questo modulo usa le API "RegOpenKeyEx", "RegQueryValueEx" e "RegCloseKey"
presenti nella libreria "advapi32".
Per leggere un valore del registro di configurazione la sintassi è la
seguente:
    GetKeyValue(Chiave, Percorso, NomeChiave, Risultato)
Dove:
Chiave è, paragonabile ad un drive, la chiave iniziale (ad es.
HKEY_CLASSES_ROOT, HKEY_USERS, ecc.) e si deve mettere il nome esadecimale.
Per semplificare, sono state dichiarate le costanti col nome che si
visualizza in regedit.
Percorso è, paragonabile ad un percorso di directory, il percorso in cui si
trova la chiave col valore da visualizzare (ad. es.
Software\Microsoft\Games) e NON deve essere ne preceduto ne seguito da
backslash ( \ ).
NomeChiave è il nome della chiave di cui si vuole sapere il valore. Per
predefinito si usa "".
Risultato è la variabile a cui viene assegnato il valore della chiave. Deve
essere dichiarata in precedenza.
Qui c'è un esempio pratico:
GetKeyValue HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion",
"ProductId", Valore
MsgBox Valore
Così viene visualizzata una finestra di messaggio che comunica il ProductId
di Windows.
Scusate ancora se il messaggio appare confusionario.
Sarei molto contento di sapere i vostri commenti.
Ciao,
    Gabriele Marrone    
Gabriele...@hotmail.com

Scusate, ho sbagliato a scrivere l'esempio fatto da me, mancava la
dichiarazione della variabile Valore, corretto č cosě:
Dim Valore As String
GetKeyValue KEY_LOCAL_MACHINE, Software\Microsoft\Windows\CurrentVersion",
"ProductId", Valore
MsgBox Valore
Ovviamente capirete che questo esempio č di 3 righe, anche se magari vi
viene visualizzato di 6 per problemi di spazio...
Ciao ancora,
    Gabriele Marrone    
Gabriele...@hotmail.com

Mi scuso se così la lettera è lunga, ma era l'unico modo.
[...]

Stefano
[...]

Hai fatto benissimo a inserire qui il codice commentato.
Grazie mille.
Era proprio quello che stavo cercando.
Ciao