如何将IntPtr转换为游标或安全句柄
本文关键字:游标 安全 句柄 转换 IntPtr | 更新日期: 2023-09-27 18:09:46
我在。net 3.5,我找到了
CursorInteropHelper.Create()
方法。然而,我完全不清楚如何将指针的IntPtr转换为SafeHandle。这里列出的SafeHandle的实现列表不包括SafeCursorHandle,其他的都是抽象的或不相关的。唯一的方法是创建我自己的SafeHandle实现吗?
SafeHandle是一个抽象类。它希望您提供一个可以释放句柄的具体SafeHandle派生类的对象。不幸的是,你忘了提到你是如何获得IntPtr的,所以我们不知道它应该如何释放。
我猜一下,假设它是一个GDI光标,你从CreateCursor() winapi函数。这需要调用DestroyCursor()来释放句柄。这样的类可以是这样的:
class SafeCursorHandle : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid {
public SafeCursorHandle(IntPtr handle) : base(true) {
base.SetHandle(handle);
}
protected override bool ReleaseHandle() {
if (!this.IsInvalid) {
if (!DestroyCursor(this.handle))
throw new System.ComponentModel.Win32Exception();
this.handle = IntPtr.Zero;
}
return true;
}
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
private static extern bool DestroyCursor(IntPtr handle);
}
根据需要调整ReleaseHandle()重写以释放你的句柄
根据MSDN文档,ReleaseHandle()必须永远不会失败:http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.releasehandle%28v=vs.110%29.aspx因为SafeHandle的功能之一是保证防止资源泄漏,所以ReleaseHandle实现中的代码必须永远不会失败。
IMO,这意味着它不能抛出——就像本地析构函数一样。