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是我試圖訪問的值:
使用'wcout'輸出的文本。 – mpiatek
你是如何檢查緩衝區是否包含垃圾值的?請注意,不能保證返回的緩衝區將包含終止零,並且由於您未初始化數組,因此僅打印數組並不安全。 –
'cbData'是BYTES中的數據,因爲您使用的是寬版本,這是錯誤的大小。並且@mpiatek說你使用'wcout'作爲你要求的unicode值。在獲取寬字符串時,使用自己的版本封裝這個函數是很有用的,因爲它們不必是零終止的,長度是字節而不是字符。另外檢查64bit/32bit子系統請參閱:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx –