RegQueryValueEx 返回 ERROR_SUCCESS 但它没有给我数据缓冲区。为啥?

Posted

技术标签:

【中文标题】RegQueryValueEx 返回 ERROR_SUCCESS 但它没有给我数据缓冲区。为啥?【英文标题】:RegQueryValueEx returns ERROR_SUCCESS but it does not get me the data buffer. Why?RegQueryValueEx 返回 ERROR_SUCCESS 但它没有给我数据缓冲区。为什么? 【发布时间】: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)中也正确返回了值的类型。但我没有得到缓冲区中的值。 它似乎总是持有垃圾值。 可能是什么问题以及如何解决?

仅供参考:我尝试访问的密钥是由我开发的 Windows 服务创建的。 DataBaseIn 是我试图访问的值:

【问题讨论】:

使用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 缓冲区后,它工作正常。谢谢! 【参考方案1】:

字符缓冲区应该被初始化,而不仅仅是声明。

wchar_t cbVal[10] = L"";

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

wcout << cbVal ;

【讨论】:

以上是关于RegQueryValueEx 返回 ERROR_SUCCESS 但它没有给我数据缓冲区。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 RegQueryValueEx 获取正确的值

RegQueryValueEx正确使用方法

使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%

将 RegQueryValueEx 用于可能是 REG_DWORD 或 REG_SZ 的注册表值

通过 RegQueryValueEx 和 RegGetValue 获取注册表值时的奇怪行为 [重复]

使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组