K

- Base de connaissances

Accueil > API WINDOWS > RegCreateKeyEx

RegCreateKeyEx

dimanche 20 avril 2014, par webmestre

Fichier DLL : advapi32.dll

Prototype VB6/VBA :

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, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long

Lire aussi :

Cette fonction crée la clé de registre spécifiée.
Si la clé existe déjà, cette la fonction l’ouvre en modification.
NB : les noms de clés ne sont pas sensibles à la casse.

Dans l’exemple proposé ci-dessous, on propose de créer un module contenant deux fonctions permettant de :

  • Mettre à jour ou créer une clé de registre UpdateKey
  • Lire la valeur d’une clé de registre GetKeyValue
Option Explicit
'------------------------------------------------
'----Déclarations des API de base de registres---
'------------------------------------------------
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public 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, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long
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, ByRef 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, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
'---------------------------------------------
'---Constantes des API de base de registres---
'---------------------------------------------
' Types de données de base de registres...
Const REG_SZ = 1            ' chaîne Unicode terminée par nul
Const REG_EXPAND_SZ = 2     ' chaîne Unicode terminée par nul
Const REG_DWORD = 4         ' nombre 32-bit
' Valeurs de type de création...
Const REG_OPTION_NON_VOLATILE = 0 ' clé préservée lorsque le système est redémarré
' Options de sécurité de clé de base de registres...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Const KEY_EXECUTE = KEY_READ
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
' Types de clé Racine de la base de registres...
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
' Valeur renvoyée...
Const ERROR_NONE = 0
Const ERROR_BADKEY = 2
Const ERROR_ACCESS_DENIED = 8
Const ERROR_SUCCESS = 0
'------------------------------------------------------
'---Type Security_Attributes de la base de registres---
'------------------------------------------------------
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long ' boolean
End Type
'---------------------------------------------------------------------------------------------------
'---Exemple d'utilisation - Debug.Print UpodateKey(HKEY_CLASSES_ROOT, "NomClé", "NouvelleValeur")---
'---------------------------------------------------------------------------------------------------
Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubKeyValue As String) As Boolean
    '---Déclaration des variables---
    Dim rc As Long                      ' Code de retour
    Dim hKey As Long                    ' Descripteur de clé de la base de registres
    Dim hDepth As Long
    Dim lpAttr As SECURITY_ATTRIBUTES   ' Type Sécurité de la base de registres
    ' Affecte les valeurs par défaut des attributs de sécurité
    lpAttr.nLength = 50
    lpAttr.lpSecurityDescriptor = 0
    lpAttr.bInheritHandle = True
    '---Crée/Ouvre une clé de base de registres---
    ' Crée/Ouvre //KeyRoot//KeyName
    rc = RegCreateKeyEx(KeyRoot, KeyName, 0, REG_SZ, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, hKey, hDepth)
   
    ' Gestion des erreurs...
    If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError
    '---Crée/Modifie une valeur de clé---
    ' NB : Un espace est nécessaire pour que la fonction RegSetValueEx() fonctionne
    If (SubKeyValue = "") Then SubKeyValue = " "
    ' Crée/Modifie une valeur de clé
    rc = RegSetValueEx(hKey, SubKeyName, 0, REG_SZ, SubKeyValue, LenB(StrConv(SubKeyValue, vbFromUnicode)))
    ' Gestion des erreurs
    If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError
   
    '---Ferme une clé de base de registres---
    rc = RegCloseKey(hKey)
     '---Renvoie succès---
    UpdateKey = True
Exit Function
CreateKeyError:
    '---Renvoie erreur---
    UpdateKey = False
    rc = RegCloseKey(hKey)
End Function
'-----------------------------------------------------------------------------------------------------------
'---Exemple d'utilisation - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, "COMCTL.ListviewCtrl.1\CLSID", "")---
'-----------------------------------------------------------------------------------------------------------
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String
    '---Déclaration des variables---
    Dim i As Long               ' Compteur de boucle
    Dim rc As Long              ' Code renvoyé
    Dim hKey As Long            ' Descripteur de clé de base de registres ouverte
    Dim hDepth As Long
    Dim sKeyVal As String
    Dim lKeyValType As Long     ' Type de données d'une clé de base de registres
    Dim tmpVal As String        ' Stockage temporaire d'une valeur de clé de base de registres
    Dim KeyValSize As Long      ' Taille d'une variable clé de base de registres
    '---Ouvre RegKey sous KeyRoot {HKEY_LOCAL_MACHINE...}---
    rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Ouvre la clé de base de registres
   
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' Gestion des erreurs
   
    tmpVal = String$(1024, 0)   ' Alloue de l'espace pour la variable
    KeyValSize = 1024           ' Définit la taille de la variable
   
    '---Récupère une valeur de clé de base de registres---
    ' Lit/Crée une valeur de clé
    rc = RegQueryValueEx(hKey, SubKeyRef, 0, lKeyValType, tmpVal, KeyValSize)
   
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' Gestion des erreurs
   
    tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)
    '---Détermine le type de valeur de clé pour la conversion---
    ' Recherche des types de données...
    Select Case lKeyValType
    Case REG_SZ, REG_EXPAND_SZ  ' Type de données String de clé de base de registres
        ' Copie la valeur String
        sKeyVal = tmpVal
    Case REG_DWORD              ' Type de données Double Word de clé de base de registres
        ' Convertit chaque bit
        For i = Len(tmpVal) To 1 Step -1
            ' Génère la valeur car. par car.
            sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1)))
        Next
       
        ' Convertit le type Double Word en String
        sKeyVal = Format$("&h" + sKeyVal)
    End Select
    GetKeyValue = sKeyVal ' Valeur renvoyée
    rc = RegCloseKey(hKey) ' Ferme la clé de base de registres
Exit Function
GetKeyError:
    ' Nettoyage après apparition d'une erreur...
    GetKeyValue = vbNullString ' Affecte une chaîne vide à la valeur renvoyée
    rc = RegCloseKey(hKey) ' Ferme la clé de base de registres
End Function

Répondre à cet article

Plan du site | Suivre la vie du site RSS 2.0 | powered by NYSTEK-EDITIONS and NYSTEK-CONSULTING