元帅.释放异常和适当的清理

本文关键字:释放 异常 元帅 | 更新日期: 2023-09-27 18:12:45

我正在用以下方法提取文件缩略图。在这种情况下,我如何正确执行清理:DeleteObject(hbitmap);Marshal.Release(hbitmap);

public ImageSource GetThumbnail(string mypath)
{
    IShellItem ppsi = null;
    IntPtr hbitmap = IntPtr.Zero;
    try
    {
        Guid uuid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
        SHCreateItemFromParsingName(mypath, IntPtr.Zero, uuid, out ppsi);
        ((IShellItemImageFactory)ppsi).GetImage(new SIZE(128, 128), SIIGBF.SIIGBF_THUMBNAILONLY, out hbitmap);
        BitmapSource source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty,
        BitmapSizeOptions.FromEmptyOptions());
        return source;
    } 
    catch (Exception ex)
    {
        return null;
    }
    finally
    {               
        if (ppsi != null)                    
            Marshal.ReleaseComObject(ppsi);
        if (hbitmap != IntPtr.Zero)
        {
            DeleteObject(hbitmap); //this
            Marshal.Release(hbitmap); //this 
        }
    }            
}

元帅。释放I get

附加信息:异常被捕获,但在通过Marshal释放一个COM接口指针。释放,元帅。ReleaseComObject或在相应的RuntimeCallableWrapper被垃圾收集。这是a的结果用户重新计数错误或其他问题与COM对象的释放。使确保折扣管理得当。而这些类型的例外被CLR发现,它们仍然会导致损坏和数据丢失因此,如果可能的话,应该解决导致异常的问题

元帅.释放异常和适当的清理

Marshal.Release仅用于com对象,而HBITMAP不是一个!DeleteObject是你所需要的。

编辑:正如Hans Passant提到的,阅读手册:

phbm[出]类型:HBITMAP *

指向一个值的指针,当此方法成功返回时,该值接收检索到的位图的句柄。当不再需要这个资源时,调用方有责任通过DeleteObject释放它。