簡體   English   中英

怎么把IntPtr轉換成Cursor或SafeHandle?

[英]How to convert IntPtr to Cursor or SafeHandle?

我在.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,這意味着它不能拋出-就像本機析構函數一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM