VBA使用Unicode字符串,但你打电话,而不是的Unicode版本(RegQueryValueExW
)的安思版本的RegQueryValueEx()
(RegQueryValueExA
)。但在这两种情况下,第五个参数将接收原始的Ansi/Unicode数据(根据型号的称呼)和第6个参数是字节表示,不字符。所以你必须说明这一点。您还必须考虑到VBA中的Declare
总是将String
值转换为Ansi,而不是Unicode。若要使用VBA Unicode字符串的Unicode API的工作,看看下面的文章提示:
VBA: Unicode Strings and the 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字符数需要接收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
我有另外一个问题。我正尝试使用ReqQueryValueExW从注册表中读取REG_BINARY数据。我得到一个longptr,但我需要传递一个字节数组到C++ dll函数。我怎样才能从longptr创建一个字节数组? – Syler
'RegQueryValueEx()'不返回longptr。你必须分配字节数组并将其传递给'RegQueryValueEx()',你只需要改变'RegQueryValueEx()'的声明来解决这个问题。 –
谢谢雷米!我今天早上弄明白了:) – Syler