C# 无法在C中解除中断IntPtr#

C# 无法在C中解除中断IntPtr#,c#,.net,pointers,intptr,C#,.net,Pointers,Intptr,我编写了一个在COM中实现IGroupPolicyObject接口的类。 其中一个方法现在返回C#中的IntPtr对象: 我想在使用属于Microset.Win32命名空间的RegistryKey对象时解除该指针的锁定 这不起作用: (RegistryKey)ghKey = rootKey.CreateSubKey(policyPath); 我找不到如何取消一个IntPtr。有人能帮忙吗 谢谢没有返回.NET注册表项对象,它返回Win32注册表项句柄(一个HKEY)。使用包含本机HKEY的In

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

我想在使用属于Microset.Win32命名空间的RegistryKey对象时解除该指针的锁定

这不起作用:

(RegistryKey)ghKey = rootKey.CreateSubKey(policyPath);
我找不到如何取消一个IntPtr。有人能帮忙吗

谢谢

没有返回.NET
注册表项
对象,它返回Win32注册表项句柄(一个
HKEY
)。使用包含本机HKEY的
IntPtr
值可以做两件有用的事情。首先,您可以将其传递给其他Win32。如果您以这种方式使用它,还需要在完成后通过调用
RegCloseKey
手动关闭它,否则它会泄漏句柄

正如@HansPassant在其评论中所指出的,您的第二个(可能更好)选择是将其转换为
SafeRegistryHandle
,并使用它获取
RegistryKey
对象:

var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);
如果您编写了
IGroupPolicyObject
的托管实现,并从该函数返回实际的
RegistryKey
对象,则:

  • 您做错了,并且您的实现无法移植到
    IGroupPolicyObject
    的任何其他使用者,并且
  • 您必须在实现中将
    RegistryKey
    对象手动编组到
    IntPtr
    中,因此只需执行相反的操作即可将其取回。(但实际上——不要这样做,返回错误的类型是违反COM合同的。)
  • 相反,应该编写此方法的实现以返回
    SafeRegistryHandle
    (我相信封送处理程序将在
    SafeHandle
    和非托管句柄之间自动转换)
    RegistryKey.Handle
    就是其中之一,因此您可以使用C类直到需要从实现中返回某些内容。

    不返回.NET
    RegistryKey
    对象,它返回Win32注册表项句柄(一个
    HKEY
    )。使用包含本机HKEY的
    IntPtr
    值可以做两件有用的事情。首先,您可以将其传递给其他Win32。如果您以这种方式使用它,还需要在完成后通过调用
    RegCloseKey
    手动关闭它,否则它会泄漏句柄

    正如@HansPassant在其评论中所指出的,您的第二个(可能更好)选择是将其转换为
    SafeRegistryHandle
    ,并使用它获取
    RegistryKey
    对象:

    var hkey = gpo.GetRegistryKey(GpoSectionMachine);
    var safeHandle = new SafeRegistryHandle(hkey, true);
    var reg = RegistryKey.FromHandle(safeHandle);
    
    如果您编写了
    IGroupPolicyObject
    的托管实现,并从该函数返回实际的
    RegistryKey
    对象,则:

  • 您做错了,并且您的实现无法移植到
    IGroupPolicyObject
    的任何其他使用者,并且
  • 您必须在实现中将
    RegistryKey
    对象手动编组到
    IntPtr
    中,因此只需执行相反的操作即可将其取回。(但实际上——不要这样做,返回错误的类型是违反COM合同的。)

  • 相反,应该编写此方法的实现以返回
    SafeRegistryHandle
    (我相信封送处理程序将在
    SafeHandle
    和非托管句柄之间自动转换)
    RegistryKey.Handle
    就是其中之一,因此您可以一直使用C类,直到需要从实现返回某些内容为止。

    通过GetRegistryKey函数,我的托管实现返回IntPtr值。你能举一个例子,说明如何将IntPtr与C#中的注册表访问函数一起使用吗?感谢Win32注册表访问函数都采用HKEY值,该值作为IntPtr转换为C。假设GETRealyYrKEY函数返回一个有效的HKEY作为一个ItpTR,您只需直接将该值传递给ReqQuyValueEx.ReqQueRealEvEX,就可以得到C++的非C语言。这就是我想要C#的全部要点。RegQueryValuex是Win32,而不是“C++”,您可以使用P/Invoke从C#调用它。但是请看我的编辑:有一种方法可以保持托管代码,根据需要在
    IntPtr
    SafeRegistryHandle
    之间切换。谢谢。我最终使用了DllImport的互操作。从GetRegistryKey函数中,我的托管实现返回IntPtr值。你能举一个例子,说明如何将IntPtr与C#中的注册表访问函数一起使用吗?感谢Win32注册表访问函数都采用HKEY值,该值作为IntPtr转换为C。假设GETRealyYrKEY函数返回一个有效的HKEY作为一个ItpTR,您只需直接将该值传递给ReqQuyValueEx.ReqQueRealEvEX,就可以得到C++的非C语言。这就是我想要C#的全部要点。RegQueryValuex是Win32,而不是“C++”,您可以使用P/Invoke从C#调用它。但是请看我的编辑:有一种方法可以保持托管代码,根据需要在
    IntPtr
    SafeRegistryHandle
    之间切换。谢谢。我最终使用了DllImport.huh的互操作系统;我甚至在回答之前就寻找这种方法,因为我确信有一种方法,但没有看到。嗯;我甚至在回答之前就寻找这种方法,因为我确信有一种方法,但没有看到。THPT。