Récupérer une valeur type Binary ou Dword dans le registre VB2005

Résolu
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012
- 30 juin 2006 à 12:30
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012
- 2 juil. 2006 à 22:36
Bonjour,
J'essaye de récupérer une valeur type Binary  et aussi Dword dans le registre mais ce qui est retourné avec la ligne ci-dessous ne correspond pas ?
dim strData as object = Nothing
strData = My.Computer.Registry.LocalMachine.OpenSubKey(NodeText, False).GetValue(strValName, Nothing)
dans le registre j'ai :
ChaineBin REG_BINARY 12 25 55 55 55 55 55 55
et ce que j'obtiens avec strData est un Array de : 18 37 85 85 85 85 85 85

ChaineDw REG_DWORD 0x00000012(18)
et ce que j'obtiens avec strData est une valeur de : 18
que je traite ensuite avec cela :

strTmp = AlphaToHex(strVal, True)
                strTmp = "0x" & strTmp & " (" & DecFromBaseX(strTmp, 16) & ")"
                strValue = strTmp

Public Function AlphaToHex(ByVal strIn As String, ByVal blnLittleEndian As Boolean) As String
        Dim strOut As String = ""
        Dim intCpt, intAsc As Integer

        If blnLittleEndian Then
            For intCpt = Len(strIn) To 1 Step -1
                intAsc = Asc(Mid(strIn, intCpt, 1))
                strOut = strOut & IIf(intAsc < 16, "0" & Hex(intAsc), Hex(intAsc))
            Next
        Else
            For intCpt = 1 To Len(strIn)
                intAsc = Asc(Mid(strIn, intCpt, 1))
                strOut = strOut & IIf(intAsc < 16, "0" & Hex(intAsc), Hex(intAsc))
            Next
        End If
        Return strOut
    End Function

 Public Function DecFromBaseX(ByVal strIn As String, ByVal intBase As Integer) As Decimal
        Dim intCpt As Short
        Dim curOut As Decimal
        Try
            If intBase > 36 Or intBase < 2 Then
                Return CDec("Base hors limite")
                Exit Function
            End If

            strIn = UCase(strIn)

            For intCpt = 1 To Len(strIn)
                curOut = curOut + DecVal(Mid(strIn, intCpt, 1)) * intBase ^ (Len(strIn) - intCpt)
            Next

            Return curOut
        Catch ex As Exception
            Return Err.Number * (-1)
        End Try
    End Function

Mais lui aussi le résultat obtenu n'est pas identique au registre
obtenu : 0x3831 (14385)

Merci si vous pouviez m'aider.
http://forum.troxsa.info/index.php?topic=20.msg59#msg59

10 réponses

Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
30 juin 2006 à 23:28
Il marche, c'est juste que j'ai pas mis la valeur de retour en forme comme tu voulais.

Je te redonne le code qui te retourne les bon format:



Dim
ObjValue
As

Object
=
My
.Computer.Registry.LocalMachine.OpenSubKey(NodeText,
False
).GetValue(strValName,
Nothing
)

Dim
strData
As

String
=
String
.Empty

If
ObjValue.GetType()
Is

GetType
(
Byte
())
Then

  
Dim
StrValue()
As

String
= System.Array.ConvertAll(
CType
(ObjValue,
Byte
()),
New
Converter(
Of

Byte
,
String
)(
AddressOf
ByteToString))

  strData =
String
.Join(" "c, StrValue)

ElseIf
ObjValue.GetType()
Is

GetType
(
Integer
)
Then

  
Dim
Value
As

Integer
=
CType
(ObjValue,
Integer
)

  
Dim
HexValue
As

String
= System.Convert.ToString(Value, 16)

  strData =
"0x"
&
New

String
("0"c, 8 - HexValue.Length) & HexValue

ElseIf
ObjValue.GetType()
Is

GetType
(
String
())
Then

  
Dim
Value()
As

String
=
CType
(ObjValue,
String
())

  strData =
String
.Join(
String
.Empty, Value)

Else

  strData =
CType
(ObjValue,
String
)

End

If

System.Windows.Forms.MessageBox.Show(strData)


Avec la fonction qui va avec:



Public

Shared

Function
ByteToString(
ByVal
[Byte]
As

Byte
)
As

String

  
Return
[Byte].ToString()

End

Function




Mais y'a une turc que je me demande:
Ca te sert à quoi de mettre les valeurs dans ce format qui n'est plus exploitable ?
Et pour les écrire dans le registre, c'est de ce format ?




Kenji

Merci de lire le règlement (vivement conseillé voir obligatoire).
/FONT>
3
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
30 juin 2006 à 21:32
Salut,

Je comprends pas trop ce que tu veux avoir. Tu as pourtant les bon résultats sauf qu'ils sont en base 10.
Ceci peux peut-être t'aider:



Dim
ObjValue
As

Object
=
My
.Computer.Registry.LocalMachine.OpenSubKey(NodeText,
False
).GetValue(strValName,
Nothing
)

Dim
strData
As

String
=
String
.Empty

If
ObjValue.GetType()
Is

GetType
(
Byte
())
Then

  
Dim
Value()
As

Byte
=
CType
(ObjValue,
Byte
())

  
For

Each
[Byte]
As

Byte

In
Value

    strData &= ChrW(
CInt
(System.Convert.ToString([Byte], 16)))

  
Next

ElseIf
ObjValue.GetType()
Is

GetType
(
Integer
)
Then

  
Dim
Value
As

Integer
=
CType
(ObjValue,
Integer
)

  
Dim
HexValue
As

String
= System.Convert.ToString(Value, 16)

  strData =
"0x"
&
New

String
("0"c, 8 - HexValue.Length) & HexValue

End

If

System.Windows.Forms.MessageBox.Show(strData)






Kenji

Merci de lire le règlement (vivement conseillé voir obligatoire).

/FONT>
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

30 juin 2006 à 22:57
Le résultat de votre code ne retournait pas la bonne valeur ?

donc en mélangent vore code et celui de TroXsa, la lecture fonctionne bien
Reste plusqu'a trouver pour faire l'inverse, ecrire du DWORD ou BINARY dans le registre

Merci

Dim strData
As
String =
String.Empty

Dim ObjValue
AsObject NothingObjValue

My.Computer.Registry.LocalMachine.OpenSubKey(NodeText,
False).GetValue(strValName,
Nothing)

'**** Traitement du format *****************

If ObjValue.GetType()
Is
GetType(
Byte())
Then
strData =
String.Empty

Dim Value()
As
Byte =
CType(ObjValue,
Byte())

For iByte
As
Integer = 0
To Value.Length - 1

If iByte = 0
Then
strData &=
String.Format(
"{0:X2}", Value(iByte))

Else
strData &=
String.Format(
" {0:X2}", Value(iByte))

End
If
Next iByte

ElseIf ObjValue.GetType()
Is
GetType(
Integer)
Then
strData =
String.Empty

Dim Value
As
Integer =
CType(ObjValue,
Integer)

Dim HexValue
As
String = System.Convert.ToString(Value, 16)
strData =
"0x" &
New
String("0"c, 8 - HexValue.Length) & HexValue

ElseIf ObjValue.GetType()
Is
GetType(
String())
Then
strData =
String.Empty

For iAr
As
Integer = 0
To UBound(ObjValue)
strData &=
CType(ObjValue(iAr),
String)

Next
Else
strData =
CType(ObjValue,
String)

End
If
'**** Traitement du format *****************
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

1 juil. 2006 à 00:38
Merci

les valeurs sont peut-être plus exploitable, mais mon listview doit refleter l'identique à ce que tu vois dans le registre.
Biensure si modification de ces valeurs il faut pouvoir les re-écrires au bon format dans le registre.

Enfin de compte mon Controle est un mini Regedit.

Claude
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
1 juil. 2006 à 12:20
Mais pour les écrires tu as:
   Pour une REG_BINARY: 12 25 55 55 55 55 55 55
   Pour une REG_DWORD: 0x00000012   
Comme c'est plus exploitable, comment peut tu reconnaitre ces valeurs ?
Je veux dire: tu as une chaine "12 25 55 55 55 55 55 55", comment peux tu dire si c'est du binary ou tu sz ? Une sz peut trés bien avoir cette valeur ! Idem pour "0x00000012".

Donc a mon avis, si tu veux faire un MiniRegedit, il faut que tu conserve les valeur que tu as au départ à savoir un tableau de Byte pour une BINARY, un integer piur une DWORD, un tableau de string pour une MULTI_SZ ..., et c'est quand tu les affiches que tu les transforme (en conservant l'orignial). Comme ca pour les modifications, il n'y as pas de problèmes de types.




Kenji

Ps:
Je me suis tromper dans mon code précédent:
Pour les binary, j'ai pas converti les valeurs en base 16.
Dim
ObjValue AsObject = My.Computer.Registry.LocalMachine.OpenSubKey(NodeText, False).GetValue(strValName, Nothing)

Dim strData AsString = String.Empty
If ObjValue.GetType() IsGetType(Byte()) Then
  Dim Value() AsByte = CType(ObjValue, Byte())
  Dim StrValue(Value.Length - 1) AsString
  For iByte AsInteger = 0 To Value.Length - 1
    StrValue(iByte) = System.Convert.ToString(Value(iByte), 16)
  Next iByte
  strData = String.Join(" "c, StrValue)
ElseIf ObjValue.GetType() IsGetType(Integer) Then
  Dim Value AsInteger = CType(ObjValue, Integer)
  Dim HexValue AsString = System.Convert.ToString(Value, 16)
  strData = "0x" & NewString("0"c, 8 - HexValue.Length) & HexValue
ElseIf ObjValue.GetType() IsGetType(String()) Then
  Dim Value() AsString = CType(ObjValue, String())
  strData = String.Join(vbNewLine, Value)
Else
  strData = CType(ObjValue, String)
EndIf
System.Windows.Forms.MessageBox.Show(strData)
(La fonction ByteToString ne sert plus)

Merci de lire le règlement (vivement conseillé voir obligatoire).
/FONT>
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

1 juil. 2006 à 14:37
je retrouve le type grace à la lecture du type (RegistryValueKind
) dans le registre
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

1 juil. 2006 à 19:03
Ca y'est cela fonctionne très bien en lecture et ecriture dans la base de registre.
Merci
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

2 juil. 2006 à 19:12
J'ai un problème pour l'écriture en binary :


 


dans Regedit meme, je tape 12 58 68 en valeur Binary le resultat après confirmation est identique pour la ligne ajouté.


 


Je tape la même chose sous VB 12 58 68 le résultat obtenu est different j'obtiens  dans le registre 12 58 0a 04 ?


 


Par contre si je tape 12 25 55 55 55 55 56 que ce soit sous Regedit ou VB le résultat est ok la ligne ajouté dans regedit est identique a ce que j'ai tapé


 


Apparement c'est de l'hexa qu'il transforme en bin ?

If CDbl(tb_RegType.Text) = REG_BINARY Then
                gvrnValue = ""
                Dim ia As Integer = 0
                gvrnValue = HexToDec(tb_Val.Text)
                ReDim ValueByte(0) ' Tableau type Byte
                For i As Integer = 1 To Strings.Len(gvrnValue) Step 2
                    ReDim Preserve ValueByte(ia) 
                    ValueByte(ia) = CInt(Strings.Mid(gvrnValue, i, 2))
                    ia += 1
                Next
end if

' Hexadecimal to Decimal
    Public Function HexToDec(ByVal hexValue As String) As String
        Dim intCpt As Integer = 0
        Dim strOut As String = String.Empty

        For intCpt = 1 To Len(hexValue) Step 2
            strOut &amp;= Int32.Parse(Strings.Mid(hexValue, intCpt, 2), System.Globalization.NumberStyles.HexNumber)
        Next
        Return strOut
    End Function
0
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
2 juil. 2006 à 20:55
Comprend pas ton code, y'a trop d'éléments externes. Simplifie le en remplacant ces éléments par des variables et des constantes.
Pour ta fonction HexToDec, tu rentre directement une chaine de style "12 25 55 55 55 55 56" ?




Kenji

Merci de lire le règlement (vivement conseillé voir obligatoire).
/FONT>
0
cs_claudetom
Messages postés
115
Date d'inscription
jeudi 11 octobre 2001
Statut
Membre
Dernière intervention
15 octobre 2012

2 juil. 2006 à 22:36
Oui je rentre 12255555555556
comme dans regedit Essayé vous verrez !!
qui est ensuite converti en Dec (a la base c'est de l'Hexa)
puis je met cela dans un tableau  de type byte 2 par 2
Ca marche bien pour certaines valeurs mais pas tous ?
Merci
0