2017-03-07 100 views
0

以下是代码:RegQueryValueEx返回ERROR_SUCCESS,但它不会让我获得数据缓冲区。为什么?

#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

+2

使用'wcout'输出的文本。 – mpiatek

+1

你是如何检查缓冲区是否包含垃圾值的?请注意,不能保证返回的缓冲区将包含终止零,并且由于您未初始化数组,因此仅打印数组并不安全。 –

+0

'cbData'是BYTES中的数据,因为您使用的是宽版本,这是错误的大小。并且@mpiatek说你使用'wcout'作为你要求的unicode值。在获取宽字符串时,使用自己的版本封装这个函数是很有用的,因为它们不必是零终止的,长度是字节而不是字符。另外检查64bit/32bit子系统请参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx –

回答

2

char buffer不应该被声明。

wchar_t cbVal[10] = L""; 

应该用wcout打印unicode字符串:

wcout << cbVal ; 
相关问题