Win API句柄的封装类

7
编写一个包装类来处理只能按值传递的句柄相对容易。我正在尝试确定封装需要通过地址传递的句柄的最佳方法。
例如,编写一个用于 QueryServiceConfig() 的按值传递的SC_HANDLE 的包装器并不难。可以实现像.GetHandle()这样的成员函数或者实现operator()
问题在于(至少对我而言),像RegOpenKeyEx()这样需要HKEY地址的API函数。
我已经阅读过重载&运算符通常是个坏主意。有没有推荐的方法可以保持封装(或尽可能多的封装)和资源收集,同时允许API函数访问?

对于这种情况,我认为我更喜欢使用Attach()和Detach()模式。你可以实现&运算符,但我觉得它很丑陋。其实并没有正确答案;这更多是个人偏好。 - Luke
1个回答

4

您可以始终添加另一层间接性,以避免可怕的重载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

hkey_deleter会确保当作用域退出或调用regkey::reset()时,注册表键被关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接