PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → RegistreEcrit et valeur dword
RegistreEcrit et valeur dword
Iniciado por guest, set., 25 2005 10:36 AM - 4 respostas
Publicado em setembro, 25 2005 - 10:36 AM
Bonjour,

Je butte depuis plusieurs jours sur le problème suivant :
Je dois écrire dans la base de registre une information précise, dans une clé, à une valeur précise.
La valeur est de type dword
"Height"=dword:0000005a

Or, si j'utilise la fonction RegistreEcrit disponible dans le WDlangage, je peux écrire dans une clé à une valeur soit du texte "blabla", soit un entier 123456 mais comment écrire de l'hexadécimal, tel que l'information à la valeur spécifiée soit : DWORD (REG_DWORD) ?

A vous lire pour me sortir de ce mauvais pas.

Fabrice.
Publicado em setembro, 26 2005 - 2:29 PM
Bonjour,



Voici le code nécessaire pour écrire des données sous leur forme binaire
dans la base de registre.



HKEY_CURRENT_USER est un entier long =
0x80000001 // adresse fixe de la clé prédéfinie



// Valeur des type d'accès à la clé

KEY_QUERY_VALUE est un entier long
= 0x1

KEY_SET_VALUE est un entier long =
0x2

KEY_CREATE_SUB_KEY est un entier long = 0x4

KEY_ENUMERATE_SUB_KEYS est un entier long = 0x8

KEY_NOTIFY est un entier long
= 0x10

KEY_CREATE_LINK est un entier long =
0x20

KEY_ALL_ACCESS est un entier long =
KEY_QUERY_VALUE+KEY_ENUMERATE_SUB_KEYS+KEY_NOTIFY+KEY_CREATE_SUB_KEY+...


KEY_CREATE_LINK+KEY_SET_VALUE

// Type de la valeur manipulée

REG_BINARY est un entier long = 3



// Chemin de la clé contenant la valeur

REG_APP_KEYS_PATH est une chaine asciiz sur 255 =
"SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"





lResult est un entier
// Résultat des appels API

dwResult est un entier long
// Handle de la clé

ValueName est une chaine asciiz sur 50 = "EnableAutodial"+caract(0) // Nom
de la valeur

dwType est un entier long = REG_BINARY
// Type de la valeur

ch est une chaine asciiz sur 4
// Buffer contenant la valeur

cbSize est un entier long = 4
// Taille du buffer



// Compteur de boucle

ii est un entier



// Variable temporaire

VarTemp est une chaine





// Ouverture de la clé

lResult = appeldll32("AdvApi32","RegOpenKeyExA",HKEY_CURRENT_USER,...


&REG_APP_KEYS_PATH,
....


0,...


KEY_ALL_ACCESS,...


&dwResult)

si lResult<>0 alors

erreur("Clé non ouverte.")

retour

FIN



// Lecture de la valeur

si appeldll32("AdvApi32","RegQueryValueExA", dwResult,...


&ValueName,...


null,...


&dwType,...


&ch,...


&cbSize) <> 0

erreur("Valeur de "+ValueName+" non lue.")

// Fermeture de la clé

appeldll32("AdvApi32","RegCloseKey",dwResult)

retour

fin



// Traitement/Affichage de la valeur en "texte": pour vérifier

VarTemp = ""

Pour ii = 1 à 4

VarTemp += numeriqueverschaine(asc(ch[[ii]]),"%02X") +
caract(32)

FIN



info("Valeur lue de "+ValueName+": "+VarTemp)



// Modif de la valeur: on met 1

ch=caract(1)+caract(0)+caract(0)+caract(0)

si appeldll32("AdvApi32","RegSetValueExA", dwResult,...


&ValueName,...


Null,...


dwType,...


&ch,...


cbSize) <> 0

erreur("Valeur de "+ValueName+" non modifiée.")

// Fermeture de la clé

appeldll32("AdvApi32","RegCloseKey",dwResult)

retour

fin



// ReLecture de la valeur

ch=""

si appeldll32("AdvApi32","RegQueryValueExA", dwResult,...


&ValueName,...


null,...


&dwType,...


&ch,...


&cbSize) <> 0

erreur("Valeur de "+ValueName+" non lue.")

// Fermeture de la clé

appeldll32("AdvApi32","RegCloseKey",dwResult)

retour

fin



// Traitement/Affichage de la valeur en "texte"

VarTemp = ""

Pour ii = 1 à 4

VarTemp += numeriqueverschaine(asc(ch[[ii]]),"%02X") +
caract(32)

FIN



info("Valeur lue de "+ValueName+": "+VarTemp)







// Fermeture de la clé

appeldll32("AdvApi32","RegCloseKey",dwResult)






--
Ed en Ligne



"Fabrice" <guest@newsgroup.fr> a écrit dans le message de news:
43364cd6$1@news.pcsoft.fr...
Bonjour,

Je butte depuis plusieurs jours sur le problème suivant :
Je dois écrire dans la base de registre une information précise, dans une
clé, à une valeur précise.
La valeur est de type dword
"Height"=dword:0000005a

Or, si j'utilise la fonction RegistreEcrit disponible dans le WDlangage,
je peux écrire dans une clé à une valeur soit du texte "blabla", soit un
entier 123456 mais comment écrire de l'hexadécimal, tel que l'information
à la valeur spécifiée soit : DWORD (REG_DWORD) ?

A vous lire pour me sortir de ce mauvais pas.

Fabrice.


Publicado em setembro, 26 2005 - 3:37 PM
Bonjour,

Merci pour votre aide.
La solution est bien lourde pour un si petit problème. Je pense que la solution d'importer un .REG est beaucoup plus simple à mettre en oeuvre ...
Dommage qu'il n'y ai pas d'option pour écrire des DWORD (ou autre) via RegistreEcrit en WDLangage.
Un évolution pour une futur version.

Encore merci pour m'avoir dépanné.

Cordialement,

Fabrice.
Publicado em setembro, 26 2005 - 10:17 PM
BOnjour,

Je butte depuis plusieurs jours sur le problème suivant :
Je dois écrire dans la base de registre une information précise, dans une
clé, à une valeur précise.
La valeur est de type dword
"Height"=dword:0000005a

Or, si j'utilise la fonction RegistreEcrit disponible dans le WDlangage,
je peux écrire dans une clé à une valeur soit du texte "blabla", soit un
entier 123456 mais comment écrire de l'hexadécimal, tel que l'information
à la valeur spécifiée soit : DWORD (REG_DWORD) ?


Pour ecrire un DWORD il suffit de faire

iHeight est un entier = 0x5a // Par exemple bien sur
RegitstreEcrit(cNomClé,cNomVal,iHeight)

Et WD ecrit automatique un REG_DWORD (pas valable pour les QWORD par contre)
du fait que iHeight est typé en DWORD ici.
Ce n'est pas un hexa (mais un chiffre binaire sur 4 octets), mais le valeur
affichée dans "regedit" le sera elle.

Amicalement

--
Francis MOREL
http://wdmlist.free.fr
Publicado em setembro, 27 2005 - 12:53 PM
Merci,

Cette solution bien plus souple me convient parfaitement.

Cordialement,

Fabrice.