元帅.释放异常和适当的清理
本文关键字:释放 异常 元帅 | 更新日期: 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释放它。