vba 7 - la récupération des valeurs de RegQueryValueEx renvoie une chaîne Unicode
Question
Je n'arrive pas à comprendre pourquoi je récupère une chaîne Unicode avec un caractère supplémentaire par lettre
Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExA" (ByVal hKey As LongPtr, ByVal lpValueName As String,
ByVal lpReserved As LongPtr, lpType As LongPtr,
lpData As Any, lpcbData As LongPtr) As LongPtr
If RegQueryValueEx(hKey, strValueName, 0, dwType,
ByVal RegData, lDataBufSize) = ERROR_SUCCESS Then
End If
Regdata a la valeur suivante "Mobile Adresse Book", mais si vous collez cela dans le bloc-notes, vous verrez tous les caractères supplémentaires.Dois-je convertir la chaîne en ascii ?
La solution
VBA utilise des chaînes Unicode, mais vous appelez le Ansi version de RegQueryValueEx()
(RegQueryValueExA
) à la place du Unicode version (RegQueryValueExW
).Mais dans les deux cas, le 5ème paramètre recevra des données brutes Ansi/Unicode (selon la version appelée) et le 6ème paramètre est exprimé en octets, pas dedans personnages.Il faut donc en rendre compte.Vous devez également tenir compte du fait que Declare
dans VBA convertit toujours String
valeurs en Ansi, jamais en Unicode.Pour travailler avec des API Unicode à l'aide de chaînes Unicode dans VBA, consultez l'article suivant pour obtenir des conseils :
VBA :Chaînes Unicode et API Windows
Par exemple:
Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExW" (ByVal hKey As LongPtr, ByVal lpValueName As LongPtr,
ByVal lpReserved As LongPtr, lpType As LongPtr,
ByVal lpData As LongPtr, lpcbData As LongPtr) As LongPtr
If RegQueryValueEx(hKey, StrPtr(strValueName), 0, dwType,
StrPtr(RegData), lDataBufSize) = ERROR_SUCCESS Then
End If
Assurez-vous simplement que RegData
est pré-attribué au nombre requis de Caractères Unicode nécessaire pour recevoir le texte Unicode, et que lDataBufSize
est initialisé avec le nombre de octets alloué dans RegData
donc RegQueryValueExW()
sait combien de caractères il peut écrire RegData
.
Mise à jour:pour lire des données binaires :
Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExW" (ByVal hKey As LongPtr, ByVal lpValueName As LongPtr,
ByVal lpReserved As LongPtr, lpType As LongPtr,
lpData As Byte, lpcbData As LongPtr) As LongPtr
Dim RegData() As Byte
...
If RegQueryValueEx(hKey, StrPtr(strValueName), 0, dwType,
RegData(0), lDataBufSize) = ERROR_SUCCESS Then
End If