我无法弄清楚为什么我会找回每个字母带有额外字符的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吗?
答案 0 :(得分:0)
VBA使用Unicode字符串,但您调用的是 Ansi 版本的RegQueryValueEx()
(RegQueryValueExA
),而不是 Unicode 版本({{ 1}})。但在这两种情况下,第5个参数将接收原始Ansi / Unicode数据(取决于所调用的版本),第6个参数以字节表示,而不是字符。所以你必须考虑到这一点。您还必须考虑到以下事实:VBA中的RegQueryValueExW
始终将Declare
值转换为Ansi,从不转换为Unicode。要在VBA中使用Unicode字符串使用Unicode API,请查看以下文章以获取提示:
VBA: Unicode Strings and the Windows API
例如:
String
只需确保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
已预先分配到接收Unicode文本所需的 Unicode字符数,并且RegData
已初始化为lDataBufSize
中分配了字节,因此RegData
知道它可以写入RegQueryValueExW()
的字符数。
更新:读取二进制数据:
RegData