Win句柄的API包装类

lin*_*s77 7 c++ windows winapi raii

为只能通过值传递的句柄编写包装类相对容易.我试图确定封装需要通过地址传递的句柄的最佳方法是什么.

例如,编写一个类似SC_HANDLE的包装器,它通过值传递给QueryServiceConfig()并不困难.一个可以实现像一个成员函数.GetHandle()或实现运算符() .

问题(至少对我来说)是像RegOpenKeyEx()这样的API函数,它需要HKEY的地址.

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

Joh*_*ell 4

您始终可以添加另一层间接层,以避免可怕的重载operator&和丑陋的AttachorDetach并从那里返回预先包装的实例。

如果您可以在 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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

hkey_deleter将确保在退出或regkey::reset()调用作用域时关闭注册表项。