2011-07-17 57 views
0

我正在嘗試讀取應用程序的安裝路徑,而我對我所得到的行爲感到莫名其妙。首先,這裏沒有工作(格式化它一點,所以它不會佔用一個巨大的線)的代碼:嘗試使用Windows/C++讀取註冊表值的奇怪錯誤

LONG status = RegQueryValueEx(
    hkRegistry, 
    "InstallPath", 
    0, 
    &regType, (LPBYTE)installPath, 
    &regSize); 
if (status == ERROR_SUCCESS) { 
    // Handle success. 
} 

我意識到,這是失敗的呼叫RegQueryValueEx,所以我決定通過增加一個例外內把它扔探測返回值:

else { 
    throw Exception(status); 
} 

但後來......代碼開始工作,並調用RegQueryValueEx成功。只要我在else內投擲,我就可以重複此行爲。如果我註釋掉else的主體,錯誤將會返回。

編輯︰好吧,我試着打電話MessageBox而不是一個例外,我得到了同樣的行爲。如果我將它評論出來,它會再次停止工作。

這是否有一個合理的解釋?

+0

你能否提供一些更多的信息,比如所有變量的聲明(或者最好甚至是所謂的整個函數)?我可以想象這是一種堆棧溢出問題,其症狀根據編譯器如何根據函數的其餘部分決定佈局堆棧而有所不同。 – Sven

+0

我意識到可能發生了什麼事,我回到了這裏,並確認了它(奇怪的是,我的問題總是如此)。當我終於明白其行爲'正確'並向我顯示'RegQueryValueEx'錯誤時,它是'ERROR_MORE_DATA',所以可能發生的情況是,由於緩衝區太小,有一定的堆棧佈局,這意味着溢出到其他堆棧元素,但是當我改變代碼時,它們之間存在差距,所以它不能這樣做。我現在在烏托邦;你可以回覆這些信息,我會接受它。 – Jengerer

+0

*只是溢出,即 – Jengerer

回答

1

regSize(必須初始化爲緩衝區大小)中包含的值相比,installPath的緩衝區可能太小。

如果installPath是堆棧分配值,我懷疑它溢出,導致status的值被覆蓋。