2011-04-20 84 views
7

爲僅通過值傳遞的句柄編寫包裝類相對容易。我想確定什麼是最好的方式來封裝需要通過地址傳遞的句柄。處理句柄的Win API包裝類

例如,寫的東西的包裝像SC_HANDLE是被按值傳遞給QueryServiceConfig()並不難。可以實現如.GetHandle()或實施運算符()的成員函數。

問題(至少對我來說)就像RegOpenKeyEx()想要一個HKEY的地址API函數。

我讀過運算符&通常是一個壞主意。什麼是推薦的方式來保持封裝(或儘可能多),特別是資源收集,同時允許API函數訪問?

+0

對於這樣的情況,我想我更喜歡Attach()和Detach()模型。你可以實現一個&運算符,但我覺得它是一個很醜陋的。沒有一個真正的答案;這更多的是個人喜好。 – Luke 2011-04-20 22:18:40

回答

2

您總是可以添加另一個間接層以避免operator&和醜陋AttachDetach的可怕超載,並從那裏返回一個預先封裝的實例。

如果你能在VS2010或GCC使用的C++ 0x,或在訪問std::unique_ptr<>的其他方法,那麼你可以做這個(錯誤檢查略去了):

struct hkey_deleter 
{ 
    void operator()(HKEY hkey) 
    { 
     ::RegCloseKey(hkey); 
    } 
}; 

typedef std::unique_ptr<HKEY__, hkey_deleter> regkey; 

regkey MyRegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired) 
{ 
    HKEY hOpenedKey = NULL; 
    ::RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &hOpenedKey); 

    return regkey(hOpenedKey); 
} 

void SomewhereElse() 
{ 
    ... 
    regkey r = MyRegOpenKeyEx(HKEY_CLASSES_ROOT, nullptr, 0, KEY_READ); 
    ... 
} 

hkey_deleter將確保當範圍退出或調用regkey::reset()時,註冊表項會被關閉。