2010-03-14 78 views
0

無論RegCreateKeyEx是否更新其倒數第二個參數引用的句柄的值,MSDN文檔似乎都保持沉默。我的測試只顯示它不更新 - 即在呼叫之前設置h = 0,將& h傳遞給RegCreateKeyEx的一個調用以打開一個不存在的密鑰,並在調用後看到h = 0。有誰知道任何情況下,處理將被改變?RegCreateKeyEx - 是否更新失敗時返回的句柄?

+0

我不認爲應該改變句柄或在API失敗時改變句柄。在測試中,我從來沒有看到它的錯誤更新。我在問是否有人注意到它被改變,或者知道它可能被改變的任何原因。我同意那篇文章說錯誤發生後你不能依賴它的價值。這個問題的出現是因爲我認爲*它*不*改變錯誤的句柄。我最近注意到這一點,並想知道可能導致的任何錯誤(程序崩潰)的範圍。 – Permaquid 2010-03-14 19:48:59

+0

如果程序編寫正確,那麼這不應該導致錯誤或問題。這是沒有指定的原因 - 一個正確的程序不應該依賴任何這樣的行爲, – 2010-03-14 19:50:33

+0

聽起來就像你說的,如果我沒有做出可能錯誤的假設,我會有一個更正確的程序。我想我必須同意這一點!但是我的實際問題呢? – Permaquid 2010-03-14 20:14:09

回答

3

它沒有記錄,因爲它是不確定的。檢查返回值 - 這就是它的用途。

即使它適用於Windows的您的特殊副本,將來的某個版本是免費做任何它想要傳遞的HKEY依賴於這種不確定的行爲被破解的程序 - 週期。

只是檢查返回值,而忽略了錯誤的情況下HKEY - 這是使用RegCreateKeyEx的唯一正確途徑。

0

我不知道這個功能的特定行爲。然而倒數第二個參數表示新創建的句柄。在失敗時,我會期望它指向一個無效的句柄值,通常用0表示。所以,在函數調用失敗後有0是完全可以預料的。

至於它是否將其設置爲0失敗,我不知道。但如果沒有記錄,我當然不會依賴它。

0

API documentation(到它會一直禮貌地提供你的問題的鏈接),說:

的指針,該接收 的句柄打開或創建的關鍵變量。

爲什麼你會認爲它應該改變手柄是否打開或創建失敗了嗎?該文檔說:

如果函數成功,則返回 值爲ERROR_SUCCESS。

這是你應該考什麼。

+1

我認爲不應該。我的測試表明它不是,至少在我的測試環境中。我確實測試了回報價值,總是有,爲什麼還要做其他事情?但是,無意中,我的一小段代碼假定它不會被改變,並且有人從分析錯誤報告的人那裏得知它看起來已經改變了。因此我的問題。我所希望的是,一些微軟內部人士會說,在某些情況下,它已經發生了變化,我可以將其與錯誤報告關聯起來。 – Permaquid 2010-03-30 17:35:59

0

API不作任何保證,但是如果它將被設置爲任何失敗時,它將被設置爲0,因此要測試此設置,您應該在撥打電話之前將其設置爲0以外的值,然後再查看如果在失敗時設置爲0。