Une class pour le registre

Description

V'là une class pour le registre
Elle gére pratiquement tous les types de valeurs
G becaup chercher mais j'y suis parvenu
Au début je voulais les REG_MULTI_SZ et les REG_DWORD mais avec les APIs.

Source / Exemple :


Option Explicit

'// Register _
{
  Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) 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 RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
  Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
  Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
  Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
  Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
  Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName 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 RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
  
  '// Registry section definitions
  Public Enum eHKey
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_USERS = &H80000003
    HKEY_PERFORMANCE_DATA = &H80000004
    HKEY_CURRENT_CONFIG = &H80000005
    HKEY_DYN_DATA = &H80000006
  End Enum
 
  '// Registry value type definitions
  Public Enum eRegMode
    REG_NONE = 0 '// No value type
    REG_SZ = 1 '// Unicode nul terminated string
    REG_EXPAND_SZ = 2 '// Unicode nul terminated string
    REG_BINARY = 3 '// Free form binary
    REG_DWORD = 4 '// 32-bit number
    REG_DWORD_LITTLE_ENDIAN = 4 '// 32-bit number (same as REG_DWORD)
    REG_DWORD_BIG_ENDIAN = 5 '// 32-bit number
    REG_LINK = 6 '// Symbolic Link (unicode)
    REG_MULTI_SZ = 7 '// Multiple Unicode strings
    REG_RESOURCE_LIST = 8 '// Resource list in the resource map
    REG_FULL_RESOURCE_DESCRIPTOR = 9 '// Resource list in the hardware description
    REG_RESOURCE_REQUIREMENTS_LIST = 10
  End Enum
  
  Public Type tValue
    Name As String
    Type As eRegMode
    Value As Variant
  End Type
  
  '// Security Mask constants
  Private Const READ_CONTROL = &H20000
  Private Const SYNCHRONIZE = &H100000
  Private Const STANDARD_RIGHTS_ALL = &H1F0000
  Private Const STANDARD_RIGHTS_READ = READ_CONTROL
  Private Const STANDARD_RIGHTS_WRITE = READ_CONTROL
  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 = ((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))
  Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
  Private Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
  Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
  
  '// Codes returned by Reg API calls
  Private Const ERROR_NONE = 0
  Private Const ERROR_BADDB = 1
  Private Const ERROR_BADKEY = 2
  Private Const ERROR_CANTOPEN = 3
  Private Const ERROR_CANTREAD = 4
  Private Const ERROR_CANTWRITE = 5
  Private Const ERROR_OUTOFMEMORY = 6
  Private Const ERROR_INVALID_PARAMETER = 7
  Private Const ERROR_ACCESS_DENIED = 8
  Private Const ERROR_INVALID_PARAMETERS = 87
  Private Const ERROR_NO_MORE_ITEMS = 259  ' _
}

'/////////////////////////////////////////////////////////////////////////////
'// Fonctions pour les opèrations sur le registre {
  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour sauver une donné dans le registre _
  {
    Public Function WriteRegistry(ByVal hKey As eHKey, ByVal Section As String, ByVal Key As String, ByVal RegMode As eRegMode, ByVal Value As Variant)
    Dim KeyValue As Long
    Call RegCreateKey(hKey, Section, KeyValue) '// Ouverture
    If RegMode = REG_DWORD Then '// Si c'est une valeur DWORD
      Call RegSetValueExLong(KeyValue, Key, 0&, RegMode, CLng(Value), 4) '// On écrit une valeur de type long
    Else
      If RegMode = REG_SZ Then Value = Value + Chr(0) '// Si c une SZ, on ajoute un 0
      Call RegSetValueExString(KeyValue, Key, 0&, RegMode, Value, Len(Value)) '// On écrit une valeur de type texte
    End If
    Call RegFlushKey(KeyValue)
    Call RegCloseKey(KeyValue)
    End Function ' _
  }

  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour lire une donnée du registre _
  {
    Public Function ReadRegistry(ByVal hKey As eHKey, ByVal Section As String, ByVal Key As String) As String
    Dim KeyValue As Long
    Dim RegMode As eRegMode
    On Error Resume Next
    Call RegOpenKey(hKey, Section, KeyValue) '// Ouverture
    ReadRegistry = Space$(2048)
    Call RegQueryValueEx(KeyValue, Key, 0&, RegMode, ReadRegistry, Len(ReadRegistry))
    If Err.Number = 0 Then
      If RegMode = REG_DWORD Then '// Si c'est une valeur DWORD
        ReadRegistry = Format$(Asc(Mid$(ReadRegistry, 1, 1)) + &H100& * Asc(Mid$(ReadRegistry, 2, 1)) + &H10000 * Asc(Mid$(ReadRegistry, 3, 1)) + &H1000000 * CDbl(Asc(Mid$(ReadRegistry, 4, 1))), "000") '// On converti le format en décimal
      ElseIf RegMode = REG_BINARY Then '// Si cest une valeur BINARY
        ReadRegistry = Left$(ReadRegistry, Len(ReadRegistry)) '// On lit la valeur
      Else '// Sinon
        ReadRegistry = Left$(ReadRegistry, InStr(ReadRegistry, Chr(0)) - 1) '// lit avant le 0
      End If
    End If
    Call RegCloseKey(KeyValue) '// Fermeture
    End Function ' _
  }

  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour lire toute les clé contenu dans une clé _
  {
    Public Function ReadRegistryKeys(ByVal hKey As eHKey, ByVal Section As String, ByRef KeyName() As String)
    Dim KeyValue As Long
    Dim sValue As String
    Dim Idx As Long
    Call RegOpenKey(hKey, Section, KeyValue) '// Ouverture
    Do
      sValue = Space$(2048)
      If (RegEnumKey(KeyValue, Idx, sValue, Len(sValue)) = 0) And (Err.Number = 0) Then '// Si on trouve une clé ...
        ReDim Preserve KeyName(Idx) As String '// Redimmentionne le tableau
        KeyName(Idx) = Left$(sValue, InStr(sValue, Chr(0)) - 1) '// Extrait le nom de la clé
      Else '// Si on trouve pas de clé, c que c la fin
         Exit Do '// On quitte la boucle
      End If
      Idx = Idx + 1 '// Incrément de l'index de clé
    Loop
    Call RegCloseKey(KeyValue) '// Fermeture
    End Function ' _
  }

  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour lire toute les valeur contenu dans une clé avec leur type et leur noms _
  {
    Public Function ReadRegistryValues(ByVal hKey As eHKey, ByVal Section As String, ByRef ValName() As tValue)
    Dim KeyValue As Long
    Dim RegMode As eRegMode
    Dim lValueLength As Long
    Dim lValueNameLength As Long
    Dim sValueName As String
    Dim sValue As String
    Dim Idx As Long
    Call RegOpenKey(hKey, Section, KeyValue) '// Ouverture
    Do '// Début de la boucle principale
      sValue = Space$(2048)
      sValueName = Space$(2048)
      lValueLength = Len(sValue)
      lValueNameLength = Len(sValueName)
      If (RegEnumValue(KeyValue, Idx, sValueName, lValueNameLength, 0&, RegMode, sValue, lValueLength) = 0) And (Err.Number = 0) Then '// Si on trouve une valeur ...
        sValueName = Left$(sValueName, lValueNameLength) '// On en extrait le nom
        sValue = ReadRegistry(hKey, Section, sValueName) '// et la valeur
        ReDim Preserve ValName(Idx) As tValue '// Redimmentionne le tableau
        ValName(Idx).Name = sValueName '// Nom de la valeur
        ValName(Idx).Type = RegMode '// Le type
        ValName(Idx).Value = sValue '// La valeur
      Else '// Si on trouve pas de valeur, c que c la fin
        Exit Do '// On quitte la boucle
      End If
      Idx = Idx + 1 '// Incrément de l'index de valeur
    Loop
    Call RegCloseKey(KeyValue) '// Fermeture
    End Function ' _
  }

  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour supprimer une valeur du registre _
  {
    Public Function DeleteValue(ByVal hKey As eHKey, ByVal Section As String, ByVal Key As String)
    Dim KeyValue As Long
    Call RegOpenKey(hKey, Section, KeyValue) '// Ouverture
    Call RegDeleteValue(KeyValue, Key) '// Supprime la valeur
    Call RegCloseKey(KeyValue) '// Fermeture
    End Function ' _
  } _

  '/////////////////////////////////////////////////////////////////////////////
  '// Fonction pour supprimer une clé du registre avec toutes celle qui s'y trouve dedans _
  {
    Public Function DeleteKey(ByVal hKey As eHKey, ByVal Section As String)
    On Error Resume Next
    Dim KeyValue As Long
    Dim SubKey() As String
    Call ReadRegistryKeys(hKey, Section, SubKey) '// On cherhce les clés contenu dans la clé
    Dim i As Integer
    For i = 0 To UBound(SubKey) '// Boucle sur toutes les clés qui sont dans la clé
      If Err.Number = 9 Then Exit For '// Si li n'y a pas de clé on quitte la boucle
      Call DeleteKey(hKey, Section & "\" & SubKey(i)) '// Rapelle la fonction pour supprimer les clés qui sont dans les clés trouvé
      Err.Clear '// Efface les erreurs
      Call RegOpenKeyEx(hKey, vbNullChar, 0&, KEY_ALL_ACCESS, KeyValue) '// Ouverture
      Call RegDeleteKey(KeyValue, Section & "\" & SubKey(i)) '// Supprime la clé
      Call RegCloseKey(KeyValue) '// Fermeture
    Next i
    Call RegOpenKeyEx(hKey, vbNullChar, 0&, KEY_ALL_ACCESS, KeyValue) '// Ouverture
    Call RegDeleteKey(KeyValue, Section) '// Supprime la clé du début
    Call RegCloseKey(KeyValue) '// Fermeture
    End Function ' _
  } _
}

Conclusion :


Pas d'erreur connu.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.