我在.NET 3.5中,我发现

CursorInteropHelper.Create()

方法在这里 但是,绝对不清楚如何将光标的IntPtr转换为SafeHandle。 上市的SafeHandle的实现列表这里不包括SafeCursorHandle等是抽象的或无关。 唯一的方法是创建自己的SafeHandle实现吗?

===============>>#1 票数:3 已采纳

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()覆盖以释放该句柄。

===============>>#2 票数:0

根据MSDN文档,ReleaseHandle()绝不能失败: http : //msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.releasehandle%28v=vs.110%29.aspx “因为SafeHandle的功能之一是确保防止资源泄漏,ReleaseHandle的实现中的代码绝不能失败。”

IMO,这意味着它不能抛出-就像本机析构函数一样。

  ask by Artem translate from so

未解决问题?本站智能推荐:

关注微信公众号