c++ CLI:从 SafeRegistryHandle 获取 HKEY
c++ CLI: get HKEY from SafeRegistryHandle
我使用注册表并使用函数 RegNotifyChangeKeyValue。第一个选项需要注册表项句柄 (HKEY),但我有 RegistryKey,我可以从中获取 SafeRegistryKey (key->Handle)。
RegistryKey^ key = myKey;
RegNotifyChangeKeyValue(key->Handle, true, dwFilter, events[i], true);
错误:"argument of type "Microsoft::Win32::SafeHandles::SafeRegistryHandle" 与类型 "HKEY" 的参数不兼容"
如何获取 HKEY?
需要转换才能从安全句柄 class 中的包装 IntPtr
转换为本机句柄。它看起来像这样:
HKEY handle = (HKEY)key->Handle->DangerousGetHandle().ToPointer();
您确实会为方法名称中的 "Dangerous" 这个词而烦恼,它的命名很恰当。在您不再需要更改通知之前,CLR 无法确保句柄保持有效。现在您的工作是确保 key
对象引用保持可见并且垃圾收集器不会过早地收集它。
它不能是局部变量,它可以 是class 的成员,但这又需要class 对象保持引用。将它存储在 static
变量中是最安全的方式,调用 GCHandle::Alloc() 是次佳方式,也许您需要 gcroot<>
。问题中没有上下文可以拨打电话。
我使用注册表并使用函数 RegNotifyChangeKeyValue。第一个选项需要注册表项句柄 (HKEY),但我有 RegistryKey,我可以从中获取 SafeRegistryKey (key->Handle)。
RegistryKey^ key = myKey;
RegNotifyChangeKeyValue(key->Handle, true, dwFilter, events[i], true);
错误:"argument of type "Microsoft::Win32::SafeHandles::SafeRegistryHandle" 与类型 "HKEY" 的参数不兼容"
如何获取 HKEY?
需要转换才能从安全句柄 class 中的包装 IntPtr
转换为本机句柄。它看起来像这样:
HKEY handle = (HKEY)key->Handle->DangerousGetHandle().ToPointer();
您确实会为方法名称中的 "Dangerous" 这个词而烦恼,它的命名很恰当。在您不再需要更改通知之前,CLR 无法确保句柄保持有效。现在您的工作是确保 key
对象引用保持可见并且垃圾收集器不会过早地收集它。
它不能是局部变量,它可以 是class 的成员,但这又需要class 对象保持引用。将它存储在 static
变量中是最安全的方式,调用 GCHandle::Alloc() 是次佳方式,也许您需要 gcroot<>
。问题中没有上下文可以拨打电话。