vba 7 – Beim Abrufen von Werten aus RegQueryValueEx wird eine Unicode-Zeichenfolge zurückgegeben

StackOverflow https://stackoverflow.com//questions/22083219

  •  24-12-2019
  •  | 
  •  

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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top