C# 无法在C中解除中断IntPtr#
我编写了一个在COM中实现IGroupPolicyObject接口的类。 其中一个方法现在返回C#中的IntPtr对象: 我想在使用属于Microset.Win32命名空间的RegistryKey对象时解除该指针的锁定 这不起作用: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
(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类直到需要从实现中返回某些内容。不返回.NETRegistryKey
对象,它返回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。