您总是可以添加另一层间接来避免可怕的重载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()
调用范围时关闭注册表项。