[英]How to convert IntPtr to Cursor or 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.