0

我编写了一个在 COM 中实现 IGroupPolicyObject 接口的类。现在,其中一种方法在 C# 中返回 IntPtr 对象:

IntPtr ghKey = objectGPolicy.GetRegistryKey(GpoSectionMachine);

我想在使用属于 Microsot.Win32 命名空间的 RegistryKey 对象时取消引用该指针。

这不起作用:

(RegistryKey)ghKey = rootKey.CreateSubKey(policyPath);

我找不到如何取消引用 IntPtr。有人可以帮忙吗?

谢谢

4

1 回答 1

6

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

  1. 你做错了,你的实现不能移植到任何其他消费者IGroupPolicyObject,并且
  2. 您必须在实现中手动将RegistryKey对象编组an IntPtr,因此只需执行相反的操作即可将其取出。(但实际上——不要那样做,你会通​​过返回错误的类型来破坏 COM 合同。)

相反,应该编写此方法的实现以返回 a SafeRegistryHandle(我相信封送拆收器会自动在SafeHandle和非托管句柄之间进行转换)。RegistryKey.Handle是其中之一,因此您可以一直使用 C# 类,直到您需要从实现中返回某些内容。

于 2012-06-15T01:47:31.870 回答