首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

GDI+ 進階議題:常見例外(一)——Generic GDI+ Error 與檔案鎖定機制

     編輯:關於.NET

1. GDI+ 歷史與安全性

GDI+ 起源於 C 撰寫的 GDI,XP 以 C++ 重寫並封裝入 .NET Framework 1.0。歷經兩次重大安全性補丁(MS04-028 JPEG 緩衝區溢位、MS08-052 遠端代碼執行)。雖無 GPU 加速(Vista 推薦 WDDM),一般應用仍足夠。

2. 「GDI+ 一般性錯誤」最滑稽的例外

代碼:

string file = "sample.jpg";
Bitmap bmp = new Bitmap(file);
bmp.Save(file, ImageFormat.Jpeg); // 拋出 ExternalException (0x80004005)

錯誤訊息「Unspecified Error」毫無線索。呼叫 Marshal.GetLastWin32Error() 得 Win32 錯誤碼 32 (ERROR_SHARING_VIOLATION):**檔案被佔用無法寫入**。

MSDN 說明:Bitmap 建構時鎖定檔案,直到 Dispose 才釋放。

解決方案:記憶體複本法

Bitmap bmpTemp = new Bitmap(image);
Bitmap bmp = new Bitmap(bmpTemp); // 建立複本
bmpTemp.Dispose(); // 釋放檔案鎖定
bmp.Save(image, ImageFormat.Jpeg); // 可安全覆寫原檔

此「土辦法」廣泛用於圖片編輯器儲存功能。

參考資料

  1. MS04-028 JPEG 緩衝區溢位
  2. MS08-052 GDI+ 遠端代碼執行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved