【发布时间】:2017-03-07 10:32:29
【问题描述】:
以下是代码:
#include <windows.h>
#include <iostream>
using namespace std;
#define WIN_32_LEAN_AND_MEAN
void readValueFromRegistry(void)
{
HKEY hKey;
DWORD lRv;
LPCWSTR subKey = L"SYSTEM\\CurrentControlSet\\Services\\HRM";
lRv = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
subKey,
0,
KEY_READ ,
&hKey
);
if (lRv == ERROR_SUCCESS)
{
DWORD BufferSize = sizeof(DWORD);
DWORD dwRet;
DWORD cbData = 10;
DWORD lpType;
wchar_t cbVal[10];
cout<<"Value before calling RegQueryValueEx is " << cbVal << endl;
dwRet = RegQueryValueEx(
hKey,
L"DataBaseIn",
NULL,
&lpType,
reinterpret_cast<LPBYTE>(cbVal),
&cbData
);
if( lpType == REG_SZ )
cout << "Reg_SZ" <<endl;
if( dwRet == ERROR_SUCCESS )
cout<<"Value is " << cbVal << endl;
else cout<<"RegQueryValueEx failed " << dwRet << endl;
}
}
int main()
{
readValueFromRegistry();
cin.get();
return 0;
}
输出是:
Value before calling RegQueryValueEx is 0030F810
Reg_SZ
Value is 0030F810
所以 RegQueryValueEx 返回 ERROR_SUCCESS,并且在 lpType(Reg_SZ)中也正确返回了值的类型。但我没有得到缓冲区中的值。
它似乎总是持有垃圾值。
可能是什么问题以及如何解决?
【问题讨论】:
-
使用
wcout输出文本。 -
如何检查缓冲区是否包含垃圾值?请注意,不能保证返回的缓冲区将包含终止零,并且由于您没有初始化数组 - 简单地打印数组是不安全的。
-
cbData是 BYTES 中的数据,因为您使用的是宽版本,这是错误的大小。正如@mpiatek 所说,使用wcout作为您要求的unicode 值。在获取宽字符串时包装此函数(使用您自己的版本)很有用,因为它们不必以零结尾并且长度以字节而不是字符为单位。还要检查 64bit / 32bit 子系统参见:msdn.microsoft.com/en-us/library/windows/desktop/… -
@mpiatek 在使用
wcout之后是空白的。就像Value before calling RegQueryValueEx is -
@AlgirdasPreidžius 在初始化 wchar_t 缓冲区后,它工作正常。谢谢!