vba 7 - 从RegQueryValueEx检索值返回unicode字符串

时间:2014-02-27 23:46:41

标签: api winapi unicode word-vba

我无法弄清楚为什么我会找回每个字母带有额外字符的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吗?

1 个答案:

答案 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