2014-02-27 25 views
-1

我无法弄清楚,为什么我回来一个Unicode字符串,每个字母多余的字符VBA 7 - 从的RegQueryValueEx检索值返回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

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 
+0

我有另外一个问题。我正尝试使用ReqQueryValueExW从注册表中读取REG_BINARY数据。我得到一个longptr,但我需要传递一个字节数组到C++ dll函数。我怎样才能从longptr创建一个字节数组? – Syler

+0

'RegQueryValueEx()'不返回longptr。你必须分配字节数组并将其传递给'RegQueryValueEx()',你只需要改变'RegQueryValueEx()'的声明来解决这个问题。 –

+0

谢谢雷米!我今天早上弄明白了:) – Syler