2017-05-13 46 views
0

我嘗試了幾個代碼,用於從註冊表中加載字符串鍵,並在測試它們後發現了我寫下來的這一個。但一個非常令人困惑的事情是,這段代碼對於HKEY_LOCAL_MACHINE/HARDWARE密鑰是有效的,但不適用於SOFTWARE密鑰。我不知道我忽略了什麼?加載註冊表鍵錯誤

char rgValue [512]; 
char fnlRes [512]; 
DWORD size1; 
DWORD Type; 
HKEY hKey = 0; 
char buf[512] = {0}; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(buf); 

if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
{ 
    dwType = REG_DWORD; 
    if(RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     cout << "key value is '" << buf << "'\n"; 
    } 
    else 
     cout << "can not query for key value\n"; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key\n"; 
+0

呼叫'GetLastError'和更新,結果你的帖子。 –

+0

@RichardCritten我不熟悉GetLastError,但將其插入我的代碼中,並返回0值。在我的主代碼成功打開regKey後RegQueryValueEx面對錯誤並且調試器跳轉到「無法查詢關鍵值」行 –

+0

剛剛閱讀了關於「RegQueryValueEx」的文檔,瞭解了返回結果,它不返回布爾值:請參閱: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx請參閱鏈接中的示例 –

回答

0

你似乎是從註冊表讀取一個DWORD值,但你試圖把它輸出到控制檯,就好像它是一個空值終止字符串代替。要讀取DWORD,您的緩衝區變量改變從char[]DWORD,並使用&運營商的地址傳遞給RegQueryValueEx(),如:

HKEY hKey = 0; 
DWORD dwValue = 0; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(dwValue); 
LONG lRes; 

lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey); 
if (lRes == ERROR_SUCCESS) 
{ 
    lRes = RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)&dwValue, &dwBufSize); 
    if (lRes == ERROR_SUCCESS) 
    { 
     if (dwType == REG_DWORD) 
      cout << "key value is " << dwValue << endl; 
     else 
      cout << "key value is not a DWORD" << endl; 
    } 
    else 
     cout << "can not query for key value. Error: " << lRes << endl; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key. Error: " << lRes << endl; 
+0

謝謝你的回答。我嘗試了一些註冊碼的代碼,但沒有加載它們。 lRes返回2爲某些鍵和234爲其他一些鍵。我檢查我的註冊表權限,沒有任何問題。我作爲管理員運行我的程序,但它不工作! –

+0

什麼令人困惑的是,我可以從一些根打開一些密鑰,但我不能讀我自己的密鑰創建在一個特殊的根! –

+0

錯誤2是'ERROR_FILE_NOT_FOUND',錯誤234是'ERROR_MORE_DATA'。兩者都在['RegQueryValueEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911.aspx)文檔中解釋:「*如果'lpValueName'指定了一個不在在註冊表中,該函數返回'ERROR_FILE_NOT_FOUND' ...如果由'lpData'參數指定的緩衝區不足以容納數據,則函數返回'ERROR_MORE_DATA'並將所需的緩衝區大小存儲在'lpcbData指向的變量中在這種情況下,'lpData'緩衝區的內容是不確定的。*「 –