lin*_*s77 7 c++ windows winapi raii
为只能通过值传递的句柄编写包装类相对容易.我试图确定封装需要通过地址传递的句柄的最佳方法是什么.
例如,编写一个类似SC_HANDLE的包装器,它通过值传递给QueryServiceConfig()并不困难.一个可以实现像一个成员函数.GetHandle()或实现运算符() .
问题(至少对我来说)是像RegOpenKeyEx()这样的API函数,它需要HKEY的地址.
我读过重载运算符&通常是一个坏主意.在允许API函数访问的同时,保持封装(或尽可能多的封装)以及特别是资源集合的推荐方法是什么?
您始终可以添加另一层间接层,以避免可怕的重载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()调用作用域时关闭注册表项。
| 归档时间: |
|
| 查看次数: |
1586 次 |
| 最近记录: |