2013-03-25 119 views
1

有什麼不對?當我想要獲得AUVersion的價值時,它會崩潰。這個密鑰存在於註冊表中,但我無法得到它。從註冊表C++崩潰獲取值

int main(int argc, char *argv[]) 
{ 
    HKEY key; 
    if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\JavaSoft\\Auto Update\\"), &key) != ERROR_SUCCESS) 
    { 
     cout << "Unable to open registry key\n\n"; 
    } 

    char path[1024]; 
    DWORD value_length = 1024; 
//here is the crash 
    RegQueryValueEx(key, "AUVersion", NULL, (LPDWORD)REG_SZ, (LPBYTE)&path, &value_length); 
    cout << "the value read from the registry is: " << path << endl; 


    system("pause"); 
    return 0; 
} 

回答

4

即第四個參數是一個LPDWORD - 一個指針指向一個DWORD。你採用了一個普通的整數並將其轉換爲一個指針,該指針在解除引用時會崩潰。

該參數收到註冊表值的類型。如果你不知道類型,那麼將它設置爲NULL。

+0

謝謝!它訣竅 – deepspace 2013-03-25 18:28:54

+0

Downvoter:爲什麼? – nneonneo 2013-03-25 18:32:17

+3

@ user1857483如果這是答案,您應該接受它。點擊此答案的綠色複選框。 – StarPilot 2013-03-25 18:34:23

4

有與呼叫的兩個錯誤RegQueryValueEx()

  • 類型參數被寫入所以必須是一個有效的地址,這是不是:

    (LPDWORD)REG_SZ 
    

和這是墜機的可能原因。

  • &path應該path

更改爲:

DWORD type; 
RegQueryValueEx(key, "AUVersion", NULL, &type, (LPBYTE) path, &value_length); 

您必須檢查的RegQueryValueEx()結果,以確保path已被填充和隨後的代碼不處理的未初始化變量:

const DWORD result = RegQueryValueEx(key, 
            "AUVersion", 
            NULL, 
            &type, 
            (LPBYTE) path, 
            &value_length); 

// Check status of the query and ensure it was a string 
// that was read. 
if (ERROR_SUCCESS == result && REG_SZ == type) 
{ 
    // Success. 
} 
+0

可以downvoter指出我的錯誤? – hmjd 2013-03-25 18:32:07

+0

有人隨機抽取我們的答案。 – nneonneo 2013-03-25 18:32:48

+0

@nneonneo,注意到這一點。我唯一省略的是它必須是'RegQueryValueEx()'的ASCII版本。 – hmjd 2013-03-25 18:33:31