Question 71

Comment vérifier l'existence d'une valeur dans la base de registre ?

La meilleure solution consiste à essayer de lire la valeur dont on veut vérifier l'existence. Si la lecture réussit, alors c'est que la valeur existe. Si la lecture échoue, alors on récupère l'erreur, ce qui nous permettra de savoir si l'échec de la lecture est dû à la non-existence de la valeur.

Voici le code de la fonction RegValueExists qui permet de vérifier l'existence d'une valeur dans la base de registre en utilisant ce principe. Le code est à placer dans un module :

' Déclaration des API
Public 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
Public 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 By Value.
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

' Constantes d'erreurs
Public Const ERROR_FILE_NOT_FOUND = 2&
Public Const ERROR_SUCCESS = 0&

' Enumération des clés "racines"
Public Enum RegRootKey
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_CONFIG = &H80000005
    HKEY_CURRENT_USER = &H80000001
    HKEY_DYN_DATA = &H80000006
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_PERFORMANCE_DATA = &H80000004
    HKEY_USERS = &H80000003
End Enum

' Les différents types d'accès possibles
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const SYNCHRONIZE = &H100000
Public Const READ_CONTROL = &H20000
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Public Const KEY_EXECUTE = (KEY_READ)
Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))

Public Function RegValueExists(RootKey As RegRootKey, SubKey As String, ValueName As String) As Boolean

    Dim RC As Long ' Code retour des API
    Dim hKey As Long ' handle de la clé ouverte

    ' Ouvre la clé
    RC = RegOpenKeyEx(RootKey, SubKey, ByVal 0&, KEY_READ, hKey)
    If RC = ERROR_SUCCESS Then
        ' Essaye de récupérer la valeur
        RC = RegQueryValueEx(hKey, ValueName, ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&)
        If RC = ERROR_SUCCESS Then
            RegValueExists = True
        ElseIf RC = ERROR_FILE_NOT_FOUND Then
            RegValueExists = False
        Else
            MsgBox "Erreur inattendue.", vbExclamation
        End If
        ' Ferme la clé
        Call RegCloseKey(hKey)
    Else
        MsgBox "Erreur inattendue.", vbExclamation
    End If

End Function

Sub Main()

    If RegValueExists(HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\Main", "Show_StatusBar") = True Then
        MsgBox "La valeur existe.", vbInformation
    Else
        MsgBox "La valeur n'existe pas.", vbInformation
    End If

End Sub

Date de publication : 14 juillet 2002
Dernière modification : 14 juillet 2002
Rubriques : Base de registre
Mots-clés : base de registre, registry, valeur, tester, existence