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 ?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top