我不明白为什么我得到一个每个字母都有额外字符的 unicode 字符串

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具有以下值“移动通讯簿”,但是如果您将其粘贴在记事本,则会看到所有额外的字符。我需要将字符串转换为ascii吗?

有帮助吗?

解决方案

VBA 使用 Unicode 字符串,但您正在调用 安西 的版本 RegQueryValueEx() (RegQueryValueExA)而不是 统一码 版本 (RegQueryValueExW)。但在这两种情况下,第 5 个参数将接收原始 Ansi/Unicode 数据(取决于调用的版本),第 6 个参数表示为 字节, ,不在 人物. 。所以你必须考虑到这一点。您还必须考虑到以下事实: Declare 在VBA中总是转换 String 值转换为 Ansi,而不是 Unicode。要在 VBA 中使用 Unicode 字符串来使用 Unicode API,请查看以下文章以获取提示:

编程语言:Unicode 字符串和 Windows API

例如:

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

只要确保 RegData 被预先分配给所需数量的 统一码字符 需要接收 Unicode 文本,并且 lDataBufSize 是用数量初始化的 字节 分配于 RegData 所以 RegQueryValueExW() 知道它可以写入多少个字符 RegData.

更新:读取二进制数据:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top