vba 7 – Beim Abrufen von Werten aus RegQueryValueEx wird eine Unicode-Zeichenfolge zurückgegeben
Frage
Ich kann nicht herausfinden, warum ich eine Unicode-Zeichenfolge mit zusätzlichen Zeichen pro Buchstabe zurückbekomme
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 hat den folgenden Wert "Mobiles Adressbuch". Wenn Sie dies jedoch in Notepad einfügen, sehen Sie alle zusätzlichen Zeichen.Muss ich die Zeichenfolge in ASCII konvertieren?
Lösung
VBA verwendet Unicode-Zeichenfolgen, aber Sie rufen die auf Ansi Version von RegQueryValueEx()
(RegQueryValueExA
) anstatt der Unicode Ausführung (RegQueryValueExW
).Aber in beiden Fällen empfängt der 5. Parameter rohe Ansi/Unicode-Daten (abhängig von der aufgerufenen Version) und der 6. Parameter wird in ausgedrückt Bytes, nicht in Figuren.Das muss man also berücksichtigen.Das muss man auch berücksichtigen Declare
in VBA wird immer konvertiert String
Werte in Ansi, niemals in Unicode.Hinweise zum Arbeiten mit Unicode-APIs unter Verwendung von Unicode-Zeichenfolgen in VBA finden Sie im folgenden Artikel:
VBA:Unicode-Strings und die Windows-API
Zum Beispiel:
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
Stellen Sie einfach sicher, dass RegData
wird der benötigten Anzahl vorbelegt Unicode-Zeichen benötigt, um den Unicode-Text zu empfangen, und zwar lDataBufSize
wird mit der Anzahl initialisiert Bytes zugeteilt in RegData
Also RegQueryValueExW()
weiß, in wie viele Zeichen es schreiben kann RegData
.
Aktualisieren:Binärdaten lesen:
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