écrire dans le base de registre type REG_MULTI_SZ

Signaler
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004
-
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
-
bonjour, j'aimerais écrire dans la base de registre mais le pb c'est que le type de ma clé est REG_MULTI_SZ
j'utilise:
Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\TrendMicro\ISNT5\WhiteBlackLists\Global\l_editBL_1", ligne

mais ma clé est changé en REG_SZ est il ne reste plus que la valeur que je voulais insérer.
Comment faire pour ajouter une valeur dans une clé de type REG_MULTI_SZ

merci

17 réponses

Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
lol jte retrouve sur ce forum après celui de PHPCS !

donc pour stocker une valeur en REG_MULTI_SZ faut remplacer la simple chaine de caractères que t'utilisais par un tableau comprenant des chaines ; ce tableau doit etre terminé par 2 caractères de code ASCII 0.

Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

Ben oui je suis là aussi!!!

Je ne comprend pas bien ce que tu veux dire , j'ai mis la valeur que je voulais insérer dans un tableau mais j'ai une erreur!

WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\TrendMicro\ISNT5\WhiteBlackLists\Global\l_editBL_1", ligne(0)

Comment je dois faire pour insérer ma valeur dans la clé REG_MULTI_SZ !!

Merci
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
ah oui... mais là c'est pas la bonne méthode... pour stocker une valeur en REG_MULTI_SZ, faut passer par une API de Windows ; et là tu peux utiliser un tableau.
voilà un exemple :
Private Const REG_MULTI_SZ = 7
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_OPTION_BACKUP_RESTORE = 4     ' open for backup or restore
Private Const REG_OPTION_VOLATILE = 1           ' Key is not preserved when system is rebooted
Private Const REG_OPTION_NON_VOLATILE = 0       ' Key is preserved when system is rebooted
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const SYNCHRONIZE = &H100000
Private Const READ_CONTROL = &H20000
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
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_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Private Const KEY_EXECUTE = (KEY_READ)
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 Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

'Dans ton Sub :

RegOpenKeyEx HKEY_LOCAL_MACHINE, "Software\TrendMicro\ISNT5\WhiteBlackLists\Global\l_editBL_1", 0, HKEY_ALL_ACCESS, Cle

RegSetValueEx Cle, "Valeur", 0, REG_MULTI_SZ, Tableau, Len(Tableau)

RegCloseKey Cle


voilà pour le code de base ; ce qui est + compliqué est d'obtenir "Tableau", qu'il faut insérer. en fait faut parcourir le tableau et à la fin de chaque ligne du tableau faut rajouter "\0" ; de plus, à la fin du tableau, faut encore rajouter "\0" (ce qui fait qu'il yaura bien 2 "\0" à la fin du tableau au total).

Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

J'ai essayé ça:

Private Const HKEY_LOCAL_MACHINE = &H80000002
Const webdir = "F:\IMSS\SiteWeb"

Const REG_MULTI_SZ = &H7

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Sub Main()
Dim ligne
If Dir(webdir & "valreg.txt") <> "" Then
Open webdir & "valreg.txt" For Input As #1
Line Input #1, ligne
Close #1

ligne = ligne & "\0" & "\0"

RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\essai", 0, HKEY_ALL_ACCESS, Cle

RegSetValueEx Cle, "val", 0, REG_MULTI_SZ, ligne, Len(ligne)

RegCloseKey Cle

End If
End Sub

Ma clé est:"HKEY_LOCAL_MACHINE\SOFTWARE\essai" et "val" et son nom ben oui je voulais pas foutre en l'aire ma vrai clé!!
Mais on peut pas faire Len d'un tableau? Tu es sur qu'il faut utiliser un tableau?
J'ai essayé d'ajouter à ma chaine ligne les caractères \0 mais ça ne fait rien du tout!
Et sinon est ce que toute ces constantes sont obligatoires?
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
pour ma part dans un code je mets les constantes comme ca au début et ensuite je les vire toutes (genre je remplace REG_MULTI_SZ par 7) mais là j'ai tout laissé pour être + explicite.

normalement faut utiliser un tableau, tu devrais refaire comme t'avais fais avant avec le ligne(0).

pour le Len() c'est pas grave tu fais le Len() de la 1ère ligne du tableau et tu ajoutes 2 vu que ya les 2 "\0" en +.
en clair c'est Len(ligne(0)) + 2

sinon jsuis désolé pour mes réponses pas très précises à plusieurs reprises mais là non plus j'ai jamais essayé...

Houzéf@
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
ah oui par contre c'est
RegSetValueEx Cle, "Val", 0, REG_MULTI_SZ, ligne, Len(ligne(0))+2

et pas RegSetValueEx Cle, "Valeur", 0, REG_MULTI_SZ, ligne(0), Len(ligne(0))+2

c'est justement pour ca que ya un "As Any" dans la déf de la fonction, c'est pour pouvoir lui envoyer tout ce qu'on veut !

Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

Maintenant g ça :
Sub Main()
Dim cle
Dim ligne(1)
If Dir(webdir & "valreg.txt") <> "" Then
Open webdir & "valreg.txt" For Input As #1
Line Input #1, ligne(0)
Close #1
ligne(0) = ligne(0) & Chr$(0) & Chr$(0)

RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\essai", 0, HKEY_ALL_ACCESS, cle

RegSetValueEx cle, "val", 0, REG_MULTI_SZ, ligne, Len(ligne(0)) + 2

RegCloseKey cle

End If
End Sub

et il me met une erreur de compil type imcompatible au niveau de ligne dans
RegSetValueEx cle, "val", 0, REG_MULTI_SZ, ligne, Len(ligne(0)) + 2
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
enfin !!! je suis à peu près sur de pas me tromper cette fois !

alors d'abord faut que jtexplik quelques trucs :
- le caractère "\0" c'est le meme que Chr$(0)
- une REG_MULTI_SZ c pas exactement un tableau, excuse. en fait tu vas comprendre par un exemple :
la chaine "Bonjour", en REG_MULTI_SZ, serait :
'B' & Chr$(0) & 'o' & Chr$(0) & 'n' & Chr$(0) & 'j' & Chr$(0) & 'o' & Chr$(0) & 'u' & Chr$(0) & 'r' & Chr$(0) & Chr$(0)

en fait faut mettre un "\0" après chaque caractère, et en mettre un à la fin (donc yen a 2 au total à la fin).

donc d'abord la ligne qui commence par RegSetValueEx serait :
RegSetValueEx cle, "val", 0, REG_MULTI_SZ, chaine_sz, Len(chaine_sz)


mais avant faut générer "chaine_sz" selon le principe que jviens de te dire. on va dire que la chaine de départ est "ligne" :
For id_for = 1 To Len(ligne)
chaine_sz = chaine_sz & Mid$(ligne, id_for, 1) & Chr$(0)
Next
chaine_sz = chaine_sz & Chr$(0)


voilà c'est pas très dur a comprendre en fait...
et sory pour toutes les con****es que jtai di avant...

Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

J'ai fait ce que tu m'as dit et je comprends pas ça ne marche pas il ne se passe rien dans le registre!
Qd on ouvre la clé ,est ce qu'on peut vérifier si elle a bien été ouverte?Peut être que ça vient de là enfin je ne sait pas!
J'ai bien vérifié aussi que ma ligne n'est pas vide.

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const REG_MULTI_SZ = 7
Private Const HKEY_LOCAL_MACHINE = &H80000002
Const webdir = "d:"

Sub Main()
Dim cle
Dim ligne
If Dir(webdir & "valreg.txt") <> "" Then
Open webdir & "valreg.txt" For Input As #1
Line Input #1, ligne
Close #1

For id_for = 1 To Len(ligne)
chaine_sz = chaine_sz & Mid(ligne, id_for, 1) & Chr(0)
Next
chaine_sz = chaine_sz & Chr(0)

RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\essai", 0, HKEY_ALL_ACCESS, cle
RegSetValueEx cle, "val", 0, REG_MULTI_SZ, chaine_sz, Len(chaine_sz)
RegCloseKey cle

End If
End Sub

Tu peut essayer de tester le code ya juste un fichier texte et une clé à créer dans le registre.Car là je désespère!
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

j'ai fair rc=RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\essai", 0, HKEY_ALL_ACCESS, cle
et il me retourne 5 il faut que rc vaut 0 pour que la clé soit ouverte. Déjà ya ça comme pb!!J'ai essayé de changer les droits mais ça marche tjs pas!
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
jai essayé chez moi, ca marche ; mais faut "régler" quelques trucs :

c'est pas HKEY_ALL_ACCESS mais KEY_ALL_ACCESS

ensuite faut garder la constante KEY_ALL_ACCESS ; tu peux mettre :
Private Const KEY_ALL_ACCESS = 983103


ensuite, faut garder les dollars que j'avais mis : c'est pas Mid(..) mais Mid$(..) ; et c'est pas Chr(0) mais Chr$(0)

voilà là pour le registre ca marche je pense. mais j'ai pas testé pour l'ouverture du fichier.

Houzéf@
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
tou ca pour rien, j'hallucine !!! voilà juste comment il faut faire en fait.

d'abor au début du sub mets :
Dim ligne As String


ensuite tu récup la valeur de ligne

puis dans l'appel de la fonction :
RegSetValueEx cle, "val", 0, REG_MULTI_SZ, ByVal ligne, Len(ligne)


faut rajouter le "ByVal" ! sinon l'histoire des "\0" etc je crois qu'en fait ca sert à rien, si ce n'est à aller à la ligne.

voilà exactement le truc : une valeur REG_MULTI_SZ est bien un tableau de chaines de caractères ; et chaque chaine est séparée par un "\0". tu verras dans le regedit qu'il ya plusieurs "lignes" : en fait pour rajouter une nouvelle ligne faut mettre un "\0".

mais dans ton cas vu qu'il ya qu'une chaine a stocker, les "\0" sont inutiles.

Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

Salut t'as passé un bon week end?

RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\essai", 0, KEY_ALL_ACCESS, cle)
RegSetValueEx cle, "val", 0, REG_MULTI_SZ, ByVal ligne, Len(ligne)
RegCloseKey cle

ça marche sans aucun traitement de la chaine avant!Merci!!
Mais maintenant ce que je veux c'est ajouter une chaine et là il m'efface tout et écrit la chaine. Ya t'il un moyen de l'ajouter simplement ou faut il tout lire et tout réajouter??
J'arrive à écrire plusieurs valeurs séparées par 1 seul Chr$(0)
mais ajouter 1 valeur sans effacer les autres j'arrive pas!!
Quel m.. ce registre!!!!
Enfin si tu as encore le courage de m'aider tu serais trop mignon!Merci!!
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
harf ba le wkend cétai po mal menfin jme demande si les trucs bizar ke je tai dit c'est pas des restes de la nuit de samedi...

donc pour ton pb ya pas de moyen "d'éditer" une valeur ; fo la lire et ré-écrire une nouvelle valeur :
Dim Cle As Long
Dim A_ecrire As String
Dim buffer As String
RegOpenKeyEx HKEY_LOCAL_MACHINE, "SOFTWARE\test", 0, KEY_ALL_ACCESS, Cle
info_cle = RegQueryValueEx(Cle, "valeur", 0, type_cle, ByVal 0, taille_buffer)If info_cle 0 And type_cle REG_MULTI_SZ Then
buffer = String(taille_buffer, Chr$(0))
info_cle = RegQueryValueEx(Cle, "valeur", 0, REG_MULTI_SZ, ByVal buffer, taille_buffer)
If info_cle = 0 Then
A_ecrire = Left$(buffer, InStr(1, buffer, Chr$(0)) - 1) & Chr$(0) & "@ + !"
RegSetValueEx Cle, "valeur", 0, REG_MULTI_SZ, ByVal A_ecrire, Len(A_ecrire)
End If
End If
RegCloseKey Cle


voilà c pas trop dur à comprendre je pense...

et jespère bien avoir été "mignon" !!

Houzéf@
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
ah oui pour RegQueryValueEx la déf c'est :
Private 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


Houzéf@
Messages postés
33
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
30 juillet 2004

RegConnectRegistry "150.38.47.10", HKEY_LOCAL_MACHINE, conn

rc = RegOpenKeyEx(conn, "SOFTWARE\essai", 0, KEY_ALL_ACCESS, Cle)

info_cle = RegQueryValueEx(Cle, "val", 0, type_cle, ByVal 0, taille_buffer)
If info_cle 0 And type_cle REG_MULTI_SZ Then

buffer = String(taille_buffer, Chr$(0))
info_cle = RegQueryValueEx(Cle, "val", 0, REG_MULTI_SZ, ByVal buffer, taille_buffer)
If info_cle = 0 Then
A_ecrire = buffer & ligne & Chr$(0) ' ligne la valeur à insérer
RegSetValueEx Cle, "val", 0, REG_MULTI_SZ, ByVal A_ecrire, Len(A_ecrire)
End If
End If
RegCloseKey Cle

Comment ça marche trop bien et en plus à distance merci merci merci!!!Tu vera que j'ai fait quelque modif car la ligne
A_ecrire = Left$(buffer, InStr(1, buffer, Chr$(0)) - 1) & Chr$(0) & "@ + !"
ne récupère que la 1ère valeur et ajoute @!
Voilà, j'ai vu que tu avais un num icq sur ton site moi aussi je chatte sur icq de temps en temps alors je te ferai un coucou car là je me souviens pas de mon num icq!!
Bisou et oui tu as été trop mignon!!
Et si j'ai un autre pb je t'appel au secours.De toute façon tu es svt sur le forum?Bye...pour le moment!
Messages postés
453
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
9 juillet 2004
2
ah oui ICQ jy suis par lintermédiaire de Odigo qui fait aussi AIM en meme temps... sinon maintenant jsuis + souvent sur msn c Zouzou123toto@hotmail.com.

et si tas un pb ba jregarde ce forum assez régulièrement, donc jtomberais pitèt sur un de tes messages...

@ + !
Houzéf@