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<>。问题中没有上下文可以拨打电话。