2017-04-20 58 views
3

考慮圍繞原始HKEY句柄的C++包裝類的情況。在預定義的註冊表鍵句柄上調用RegCloseKey

包裝類有一個構造函數過載,以HKEY句柄作爲輸入:構造的對象獲取輸入原始句柄的所有權。
析構函數在包裝句柄上調用RegCloseKey(),存儲在HKEY m_hKey數據成員中。

現在,考慮將預定義的句柄(如HKEY_CURRENT_USER)傳遞給構造函數重載的情況。 HKEY_CURRENT_USER值分配給m_hKey成員。

析構函數在該預定義鍵上調用RegCloseKey()。在我的實驗中,API在此情況下返回0,意思是:成功。那麼,在預定義的註冊表鍵處理上撥打RegCloseKey()是否可以? 還是應該進一步檢查來實現,如:

RegistryKey::~RegistryKey() 
{ 
    if ((m_hKey != nullptr) && !IsPredefinedKey(m_hKey)) 
     ::RegCloseKey(m_hKey); 
} 
+0

可能是你想禁止將預定義鍵傳遞給包裝類的構造函數。 – KonstantinL

回答

3

的MSDN文檔爲RegOpenKey function推斷,你只需要調用RegCloseKey您用來編程創建句柄。

... 如果密鑰不是預定義的註冊表項之一,請在完成使用該句柄後調用RegCloseKey函數。

+0

我在['RegOpenKeyEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724897(v = vs.85).aspx)的MSDN文檔上閱讀了類似內容。事實上,我期望返回值不同於0,從使用預定義鍵調用的'RegCloseKey';但在我的測試中,'RegCloseKey'總是返回0. –

+2

我也看到了'RegOpenKeyEx'。只要我的0.02美元,但我可能在謹慎方面犯錯,即使它看起來無害,也不要試圖關閉手柄。 –

1

我找不到說它沒問題的官方文檔,但我知道它的工作原理。

我得到的最接近是this book

實際上,你可以調用RegCloseKey預定義的根密鑰條目之一。

它可能發生了很多在野外,所以我不能想象,微軟將改變這個在未來,但沒有正式文件真的是你,如果你想冒險與否。

+3

是否安全,是無證行爲。根據['RegCloseKey()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724837.aspx)文檔:「*要打開的關鍵句柄。**該句柄必須已經由'RegCreateKeyEx','RegCreateKeyTransacted','RegOpenKeyEx','RegOpenKeyTransacted'或'RegConnectRegistry'函數打開。**「 –

+2

然後再次,[預定義鍵]上的文檔(https:// msdn.microsoft.com/en-us/library/windows/desktop/ms724836.aspx)有衝突的信息:*「預定義句柄不是線程安全的。**在一個線程中關閉預定義句柄**會影響任何其他線程「* – IInspectable

+0

@Remy如果子鍵路徑爲NULL,則可以打開預定義的句柄,並且RegOpenKey(不是Ex)可以返回您傳入的相同句柄。 – Anders