Win句柄的API包装器类

Win API wrapper classes for handles

本文关键字:包装 API 句柄 Win      更新时间:2023-10-16

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

例如,为SC_HANDLE之类的内容编写包装器,它按值传递给QueryServiceConfig()并不困难。可以实现像. gethandle ()这样的成员函数,或者实现operator()

问题(至少对我来说)是API函数,如RegOpenKeyEx(),需要一个HKEY的地址。

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

你总是可以添加另一个间接层来避免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()时关闭注册表项。