首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将IntPtr转换为游标或SafeHandle?

如何将IntPtr转换为游标或SafeHandle?
EN

Stack Overflow用户
提问于 2013-04-17 07:23:01
回答 2查看 1.6K关注 0票数 1

我在.NET 3.5中,我发现

代码语言:javascript
复制
CursorInteropHelper.Create()

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 10:50:11

SafeHandle是一个抽象类。它希望您提供一个可以释放句柄的具体SafeHandle派生类的对象。不幸的是,您忘记提到您是如何获得该IntPtr的,因此我们无法知道它应该如何发布。

我将猜测并假设它是一个GDI游标,就是您从CreateCursor() winapi函数中获得的游标。这需要调用DestroyCursor()来释放句柄。这样的类可能如下所示:

代码语言:javascript
复制
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()覆盖,以释放您的情况下的句柄。

票数 3
EN

Stack Overflow用户

发布于 2014-04-23 15:23:43

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16048885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档