7

为仅按值传递的句柄编写包装类相对容易。我试图确定最好的方法是封装需要通过地址传递的句柄。

例如,为SC_HANDLE之类的东西编写一个按值传递给QueryServiceConfig()的包装器并不难。可以实现一个成员函数,如.GetHandle()或实现operator()

问题(至少对我而言)是像RegOpenKeyEx()这样需要HKEY地址的API 函数。

我读过重载运算符 & 通常是一个坏主意。在允许 API 函数访问的同时保持封装(或尽可能多的封装),尤其是资源收集的推荐方法是什么?

4

1 回答 1

3

您总是可以添加另一层间接来避免可怕的重载operator&和丑陋Attach,或者Detach从那里返回一个预先包装的实例。

如果你可以在 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()调用范围时关闭注册表项。

于 2011-04-20T23:44:12.807 回答