2017-03-07 23 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 ; 
相關問題