OVH Cloud OVH Cloud

base de registre

5 réponses
Avatar
arkangel
Bonjour,
Comment faire pour ecrire une clè dans la base de registre avec
le type DWORD et lui mettre une valeur.
Avec les Api je suis prenneur
Meric d'avance

5 réponses

Avatar
RegCreateKeyEx
The RegCreateKeyEx function creates the specified key. If
the key already exists in the registry, the function opens
it.

LONG RegCreateKeyEx(
HKEY hKey, // handle to an open key
LPCTSTR lpSubKey, // address of subkey name
DWORD Reserved, // reserved
LPTSTR lpClass, // address of class string
DWORD dwOptions, // special options flag
REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// address of key security
structure
PHKEY phkResult, // address of buffer for
opened handle
LPDWORD lpdwDisposition // address of disposition
value buffer
);

RegOpenKeyEx
The RegOpenKeyEx function opens the specified key.

LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey to open
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // address of handle to open key
);

RegCloseKey
The RegCloseKey function releases a handle to the
specified key.

LONG RegCloseKey(
HKEY hKey // handle to key to close
);

RegSetValueEx
The RegSetValueEx function sets the data and type of a
specified value under a registry key.

LONG RegSetValueEx(
HKEY hKey, // handle to key to set value for
LPCTSTR lpValueName, // name of the value to set
DWORD Reserved, // reserved
DWORD dwType, // flag for value type
CONST BYTE *lpData, // address of value data
DWORD cbData // size of value data
);

dwType
Specifies the type of information to be stored as the
value's data. This parameter can be one of the following
values: Value Meaning
REG_BINARY Binary data in any form.
REG_DWORD A 32-bit number.


-----Message d'origine-----
Bonjour,
Comment faire pour ecrire une clè dans la base de


registre avec
le type DWORD et lui mettre une valeur.
Avec les Api je suis prenneur
Meric d'avance
.



Avatar
arkangel
écrivait
news:675e01c42eab$38bcd040$:

RegCreateKeyEx
The RegCreateKeyEx function creates the specified key. If
the key already exists in the registry, the function opens
it.

LONG RegCreateKeyEx(
HKEY hKey, // handle to an open key
LPCTSTR lpSubKey, // address of subkey name
DWORD Reserved, // reserved
LPTSTR lpClass, // address of class string
DWORD dwOptions, // special options flag
REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// address of key security
structure
PHKEY phkResult, // address of buffer for
opened handle
LPDWORD lpdwDisposition // address of disposition
value buffer
);

RegOpenKeyEx
The RegOpenKeyEx function opens the specified key.

LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey to open
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // address of handle to open key
);

RegCloseKey
The RegCloseKey function releases a handle to the
specified key.

LONG RegCloseKey(
HKEY hKey // handle to key to close
);

RegSetValueEx
The RegSetValueEx function sets the data and type of a
specified value under a registry key.

LONG RegSetValueEx(
HKEY hKey, // handle to key to set value for
LPCTSTR lpValueName, // name of the value to set
DWORD Reserved, // reserved
DWORD dwType, // flag for value type
CONST BYTE *lpData, // address of value data
DWORD cbData // size of value data
);

dwType
Specifies the type of information to be stored as the
value's data. This parameter can be one of the following
values: Value Meaning
REG_BINARY Binary data in any form.
REG_DWORD A 32-bit number.


-----Message d'origine-----
Bonjour,
Comment faire pour ecrire une clè dans la base de


registre avec
le type DWORD et lui mettre une valeur.
Avec les Api je suis prenneur
Meric d'avance
.






Merci beaucoup je vais essyé avec
Avatar
Aski
Bonjour,

"arkangel" a écrit dans le message de
news:
Bonjour,
Comment faire pour ecrire une clè dans la base de registre avec
le type DWORD et lui mettre une valeur.
Avec les Api je suis prenneur
Meric d'avance



Je préfère répondre en VB qu'en C et en français qu'en anglais : c'est moins
ésotérique.
Il s'agit d'un article de MSDN que j'ai traduit.
J'ai utilisé ces fonctions pour gérer la base de registre des règles de
courrier d'utlook Express.
À ta disposition si tu as quelque problème.

Henri

Comment utiliser les API pour sauver et obtenir les données de la base de
registre

RÉSUMÉ

Bien que Visual Basic 4.0 inclue les fonctions SaveSetting et GetSetting
pour sauver et obtenir les données de la base de registre, ces fonctions ne
conviennent que pour sur une section spécifique de la base de registre, les
données de programme de Visual Basic et de VBA de la clef HKEY_CURRENT_USER.

Cet article décrit l'utilisation des fonctions de l'API Windows 32 bits, qui
peuvent être utilisées pour enregistrer et lire n'importe quelle valeur du
registre. Les références des sujets et des fonctions de cet article peuvent
être généralisées aux registres 16 bits.

Les fonctions de l'API 32 bits incluent aussi l'appui pour la sécurité, bien
que ce sujet n'entre pas dans l'objet de cet article.

NOTE : les fonctions SaveSetting et GetSetting ne font pas partie de la
bibliothèque de fonctions de VBA. Cependant, les exemples de code ci-dessous
s'appliquent également aux applications 32 bits qui implémentent VBA.

INFORMATION COMPLÉMENTAIRE

Information Générale sur la base de registre

Le registre est utilisé par les applications et par Windows pour stocker les
données de configuration. Cette base remplace les nombreux fichiers INI qui
proliféraient sous Windows 3.x et est largement utilisée par les OLE.

Le registre est organisé en une série hiérarchique de clefs et de valeurs
ressemblant à un arbre. Chaque clef, commençant par l'une des six clefs de
racine prédéterminées, peut avoir des sous-clefs et des valeurs
correspondantes. Les clefs sont des unités organisationnelles et
référentielles ; elles apparaissent, dans les éditeurs de base de registre
de Windows 95 et de Windows NT, comme des dossiers. Les valeurs sont des
entrées de données et apparaissent comme des entrées de texte dans le volet
de droite de l'éditeur. Les clefs peuvent ne pas avoir de valeur associée,
comme elles peuvent en avoir beaucoup. Chaque valeur a un type de données
associé. Les deux types de données de registre les plus généralement
utilisées sont les chaînes à terminaison nulle REG_SZ, et les nombres 32
bits REG_DWORD.

Le principe de base utilisé pour écrire dans un emplacement donné de la base
de registre est le même. Pour faire référence à une clef donnée ou valeur
donnée, vous devez avoir la référence de la clef. Une fois que cette
référence obtenue, les valeurs et les sous-clefs de la clef, à laquelle se
rapporte la référence, peuvent être lues, inscrites ou listées.

Étant donné un emplacement dans le registre, pour obtenir la référence à
cette clef, vous devez commencer par une des six clefs prédéfinies
(HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS,
HKEY_CURRENT_CONFIG et HKEY_DYN_DATA) et parcourir l'arbre du registre jusqu
'à ce que la clef désirée soit atteinte. Les programmes d'utilisateur lisent
et écrivent le plus souvent dans HKEY_CURRENT_USER et HKEY_LOCAL_MACHINE. Si
les clefs parcourues existent déjà, vous pouvez utiliser une série d'appels
aux fonctions RegOpenKey ou le RegOpenKeyEx. Si les clefs doivent être
créées, les fonctions RegCreateKey et RegCreateKeyEx le font.

Avec la référence à la clef désirée, les fonctions utilisées pour lister,
inscrire ou récupérer l'information peuvent être appelées. Dans tous les
cas, les fonctions avec le suffixe Ex travailleront seulement sur des
plates-formes 32 bits. Les fonctions sans le suffixe peuvent travailler à la
fois sur les versions 16 bits et 32 bits de Windows. Gardez à l'esprit que
toutes les fonctions de registre sans le suffixe Ex ne sont pas toutes des
fonctions assurant la compatibilité 16 bits. Le suffixe Ex a été ajouté
iniquement lorsque les capacités de fonctions 16 bits ont été étendues. Les
fonctions qui sont totalement nouvelles et spécifiques aux plates-formes 32
bits ne possèdent pas l'extension Ex.

Les fonctions RegSetValue et RegSetValueEx permettent d'inscrire une valeur
à modifier, tandis que RegQueryValue et RegQueryValueEx récupèrent l'
inscription d'une valeur. Les limitations des non-Ex, versions 16 bits de
ces API sont très évidentes. Avec la fonction RegSetValue 16 bits il n'y a
aucune façon de nommer une valeur, c'est pourquoi RegSetValue ne peut pas
être utilisé pour associer plus d'une valeur par clef. De plus, toutes les
valeurs écrites avec RegSetValue ont un type de données de REG_SZ. Ces
limitations sont inhérentes au registre 16 bits. RegSetValueEx permet la
création de valeurs multiples avec n'importe quel type de donnée disponible.

Comment écrire à un emplacement spécifique du registre

Après avoir déterminé quelles fonctions seront nécessaires pour votre
projet, copier les déclarations appropriées à la fin de cet article dans un
module basic. Les deux procédures Visual Basic incluses (SetValueEx et
QueryValueEx) sont des conteneurs pour les fonctions API RegSetValueEx et
RegQueryValueEx qui simplifient beaucoup leur utilisation. Les notes qui
suivent utilisent ces fonctions Visual Basic ; cependant, vous êtes libres
de faire des appels directement à l'API si vous le souhaitez.

Création/modification de clefs et valeurs

Avec les déclarations et les procédures disponibles, vous pouvez créer et
ouvrir des clefs et ajouter, modifier et lire des valeurs. Les trois
sections suivantes expliquent comment créer une clef, enregistrer ou
modifier une valeur et interroger une valeur.

Création d'une nouvelle clef

Créer une nouvelle clef est aussi simple que d'utiliser la procédure
suivante. CreateNewKey prend le nom de la clef à créer et la constante
représentant la clef prédéterminée pour créer la clef suivante. L'appel à
RegCreateKeyEx ne profite pas des mécanismes de sécurité prévus, mais
pourrait être modifié pour le faire. Une discussion concernant la sécurité
de la base de registre est hors du cadre de cet article.

Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
'référence de la nouvelle clef
Dim hNewKey As Long
'résultat de la fonction de RegCreateKeyEx
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
0&, hNewKey, lRetVal)
RegCloseKey (hNewKey)
End Sub

Avec cette procédure un appel de :
CreateNewKey "TestKey", HKEY_CURRENT_USER
créera une clef appelée TestKey immédiatement sous HKEY_CURRENT_USER.

Appeler CreateNewKey comme suit :
CreateNewKey "TestKeySubKey1SubKey2", HKEY_LOCAL_MACHINE
créera trois clefs imbriquées commençant par TestKey immédiatement sous
HKEY_LOCAL_MACHINE, SubKey1 secondaire de TestKey et SubKey3 sous SubKey2.

Inscription/modification d'une valeur

La création et l'inscription d'une valeur d'une clef spécifiée peut être
réalisée par la petite procédure suivante. SetKeyValue prend la clef avec
laquelle la valeur sera associée, le nom de la valeur, l'inscription de la
valeur et le type de la valeur (la fonction SetValueEx accepte seulement
REG_SZ et REG_DWORD, mais cela peut être modifié si nécessaire). La
spécification d'une nouvelle valeur pour sValueName existant modifiera
l'inscription actuelle de cette valeur.

Private Sub SetKeyValue (sKeyName As String, sValueName As String,
vValueSetting As Variant, lValueType As Long)
'résultat de la fonction SetValueEx
Dim lRetVal As Long
'référence de la clef ouverte
Dim hKey As Long
'ouvrir la clef spécifiée
lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
KEY_ALL_ACCESS, hKey)
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
RegCloseKey (hKey)
End Sub

Un appel de :
SetKeyValue "TestKeySubKey1", "StringValue", "Hello", REG_SZ
créera une valeur de type REG_SZ appelée "SubKey1" avec l'inscription de
"Hello". Cette valeur sera associée à la clef SubKey1 de "TestKey".

Dans ce cas, "TestKey" est une sous-clef de HKEY_CURRENT_USER, mais cela
peut être modifié en changeant l'appel à RegOpenKeyEx. Cet appel échouera si
"TestKeySubKey1" n'existe pas. Pour éviter ce problème, utiliser un appel à
RegCreateKeyEx au lieu d'un appel à RegOpenKeyEx. RegCreateKeyEx ouvrira la
clef indiquée si elle existe.

Interrogation d'une Valeur

La procédure suivante peut être utilisée pour vérifier l'inscription d'une
valeur existante. QueryValue prend le nom de la clef et le nom d'une valeur
associée à cette clef et affiche la valeur correspondante dans une boîte de
message. Il utilise un appel à la fonction conteneur QueryValueEx définie
ci-dessous, qui n'accepte que les types REG_DWORD et REG_SZ.

Private Sub QueryValue (sKeyName As String, sValueName As String)
'résultat de la fonction API
Dim lRetVal As Long
'référence de la clef ouverte
Dim hKey As Long
'inscription de la valeur interrogée
Dim vValue As Variant
lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
KEY_ALL_ACCESS, hKey)
lRetVal = QueryValueEx(hKey, sValueName, vValue)
MsgBox vValue
RegCloseKey (hKey)
End Sub

Avec cette procédure, un appel de :
QueryValue "TestKeySubKey1", "StringValue"
affichera la valeur inscrite dans "StringValue" et suppose que "StringValue"
existe dans la clef "TestKeySubKey1".
<<<<<<<<<<<<<<<<<<<<<<<<
Si la Valeur que vous interrogez n'existe pas, QueryValue retournera le code
d'erreur 2 - 'ERROR_BADKEY'.

Notes Complémentaires

Les exemples précédents emploient exclusivement les versions étendues 32
bits des fonctions de registre. Ces fonctions permettent d'associer plus
qu'une valeur à chaque clef. Comme discuté plus haut, RegSetValue 16 bits et
RegQueryValue agissent sur une valeur simple associée à la clef actuelle
(qui est toujours de type REG_SZ). Ces fonctions apparaissent dans l'éditeur
de registre 32 bits avec un nom de <NO NAME>. Pour inscrire, modifier, ou
interroger cette valeur spéciale associée, il faut employer les fonctions de
registre 16 bits. La lecture et l'écriture dans le registre en environnement
16 bits est beaucoup plus simple qu'en environnement 32 bits. La même
procédure Basic est suivie : ouvrir une clef et obtenir une référence, puis
appeler votre fonction de modification avec cette référence, mais aucune
considération ne doit être faite pour des valeurs multiples associées ou
pour des types de données de valeur différentes. Une application 16 bits
peut créer et modifier des clefs et des valeurs avec les déclarations des
fonctions RegCreateKey, RegOpenKey, RegQueryValue, RegSetValue et
RegCloseKey.

Dans certains cas, il n'est pas nécessaire d'associer des valeurs à une
clef. Une application peut seulement vouloir savoir si une certaine clef ou
une valeur existe, sans se préoccuper de la nature des valeurs de la clef.
Dans une telle situation, les fonctions RegEnumKey, RegEnumKeyEx et
RegEnumValue peuvent être employées pour déterminer si une certaine clef ou
sa valeur existe. Pour plus d'information sur ces fonctions se référer à la
visionneuse et/ou au référentiel des API Windows.

Fonctions API et déclarations des constantes

Option Explicit
Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4
Global Const HKEY_CLASSES_ROOT = &H80000000
Global Const HKEY_CURRENT_USER = &H80000001
Global Const HKEY_LOCAL_MACHINE = &H80000002
Global Const HKEY_USERS = &H80000003
Global Const ERROR_NONE = 0
Global Const ERROR_BADDB = 1
Global Const ERROR_BADKEY = 2
Global Const ERROR_CANTOPEN = 3
Global Const ERROR_CANTREAD = 4
Global Const ERROR_CANTWRITE = 5
Global Const ERROR_OUTOFMEMORY = 6
Global Const ERROR_INVALID_PARAMETER = 7
Global Const ERROR_ACCESS_DENIED = 8
Global Const ERROR_INVALID_PARAMETERS = 87
Global Const ERROR_NO_MORE_ITEMS = 259
Global Const KEY_ALL_ACCESS = &H3F
Global Const REG_OPTION_NON_VOLATILE = 0

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

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, ByVal lpSecurityAttributes As Long, _
phkResult As Long, lpdwDisposition As Long) As Long

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

Declare Function RegQueryValueExString 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

Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Long, _
lpcbData As Long) As Long

Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, _
lpcbData As Long) As Long

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

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

SetValueEx and QueryValueEx Wrapper Functions

Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType
As Long, vValue As Variant) As Long
Dim lValue As Long
Dim sValue As String
Select Case lType
Case REG_SZ
sValue = vValue & Chr$(0)
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType,
sValue, Len(sValue))
Case REG_DWORD
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType,
lValue, 4)
End Select
End Function

Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String, _
vValue As Variant) As Long
Dim cch As Long
Dim lrc As Long
Dim lType As Long
Dim lValue As Long
Dim sValue As String
On Error GoTo QueryValueExError
' Détermine la taille et le type de donnée à lire
lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
If lrc <> ERROR_NONE Then Error 5
Select Case lType
' pour les chaînes
Case REG_SZ:
sValue = String(cch, 0)
lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue,
cch)
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch-1)
Else
vValue = Empty
End If
' For DWORDS
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)
If lrc = ERROR_NONE Then vValue = lValue
Case Else
'aucun autre type de donnée n'est supporté
lrc = -1
End Select
QueryValueExExit:
QueryValueEx = lrc
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function
Avatar
Arkangel
"Aski" écrivait
news::

Comment utiliser les API pour sauver et obtenir les donn‚es


de la base
de registre

R


Avatar
Aski
Bonjour

De rien. Désolé, mais je m'aperçois que les accents ont été mal transférés.
La prochaine fois, j'utiliserai le format HTML.

Henri

"Arkangel" a écrit dans le message de
news:
"Aski" écrivait
news::

> Comment utiliser les API pour sauver et obtenir les donn,es
de la base
> de registre
>
Alors là je te dit un grand merci. Tes explications sont
claires et
concises. Encore un grand merci
Arkangel