IGroupPolicyObject.GetRegistryKey
不返回 .NETRegistryKey
对象,它返回 Win32 注册表项句柄 (an HKEY
)。IntPtr
使用包含本机 HKEY的值可以做两件有用的事情。首先,您可以将其传递给其他 Win32注册表访问函数。如果这样使用,还需要RegCloseKey
在完成后通过调用手动关闭它,否则会泄露句柄。
正如@HansPassant 在他的评论中有用地指出的那样,您的第二个(可能更好)的选择是将它变成 aSafeRegistryHandle
并使用它来获取一个RegistryKey
对象:
var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);
如果您编写了 的托管实现并从该函数IGroupPolicyObject
返回一个实际对象,则:RegistryKey
- 你做错了,你的实现不能移植到任何其他消费者
IGroupPolicyObject
,并且
- 您必须在实现中手动将
RegistryKey
对象编组为an IntPtr
,因此只需执行相反的操作即可将其取出。(但实际上——不要那样做,你会通过返回错误的类型来破坏 COM 合同。)
相反,应该编写此方法的实现以返回 a SafeRegistryHandle
(我相信封送拆收器会自动在SafeHandle
和非托管句柄之间进行转换)。RegistryKey.Handle
是其中之一,因此您可以一直使用 C# 类,直到您需要从实现中返回某些内容。