【问题标题】:How to convert IntPtr to Cursor or SafeHandle?如何将 IntPtr 转换为 Cursor 或 SafeHandle?
【发布时间】:2013-04-16 23:23:01
【问题描述】:

我在 .NET 3.5 中,我发现

CursorInteropHelper.Create()

方法here。但是,绝对不清楚如何将 IntPtr for cursor 转换为 SafeHandle。 here 列出的 SafeHandle 的实现列表不包括 SafeCursorHandle,其他的实现是抽象的或不相关的。唯一的方法是创建我自己的 SafeHandle 实现吗?

【问题讨论】:

    标签: c# wpf cursor handle


    【解决方案1】:

    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】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-09
        • 2013-08-12
        • 2010-09-07
        • 2016-12-07
        • 1970-01-01
        • 2010-10-06
        • 2010-10-20
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多