2013-04-16 2 views
0

Я в .NET 3.5, я нашелКак преобразовать IntPtr в Cursor или SafeHandle?

CursorInteropHelper.Create() 

метод here. Однако совершенно неясно, как преобразовать IntPtr для курсора в SafeHandle. Список реализованных версий SafeHandle here не включает SafeCursorHandle, а другие - абстрактные или несвязанные. Единственный способ - создать собственную реализацию SafeHandle?

ответ

2

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() замещают по мере необходимости, чтобы освободить ручку в вашем случае.

0

Согласно документу MSDN, ReleaseHandle() никогда не должны потерпеть неудачу: http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.releasehandle%28v=vs.110%29.aspx «Поскольку одна из функций SafeHandle является обеспечение предотвращения утечки ресурсов, код в вашей реализации ReleaseHandle никогда не должны потерпеть неудачу.»

IMO, это означает, что он не должен бросать - точно так же, как и местные деструкторы.