RegQueryValueEx返回ERROR_SUCCESS,但它不会让我获得数据缓冲区。为什么?

时间:2017-03-07 10:32:29

标签: c++ windows registry

以下是代码:

#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)中正确返回值的类型。但我没有得到缓冲区中的值。 它似乎总是持有垃圾值。 可能是什么问题以及如何解决?

仅供参考:我尝试访问的密钥是由我开发的Windows服务创建的。 DataBaseIn是我试图访问的值: Some of the values in the HRM key

1 个答案:

答案 0 :(得分:2)

char缓冲区应该初始化,不仅声明。

wchar_t cbVal[10] = L"";

应该使用wcout打印unicode字符串:

wcout << cbVal ;