GDI +

2011-07-20 53 views
1

發生了一般性錯誤我有一個傳統的Winforms應用程序,使用它時會引起一些奇怪的問題。應用程序的部分處理圖像,用戶可以將圖像添加到記錄中,這些圖像在.Net中調整大小並保存到服務器共享中。我在使用這個應用程序時遇到了兩個問題,這兩個問題都會導致「GDI +中出現通用錯誤」。GDI +

用戶可以查看記錄和圖像顯示了罰款,他們可以嘗試打印和選擇對話框中的打印機出現,但是當他們點擊打印,他們得到了錯誤。另一種是當用戶嘗試向記錄添加新圖像時,出現相同的通用錯誤。最好的部分 - 只有兩個用戶有這個問題。

的圖像可以從共享直接打開並印刷,沒有問題。這兩個用戶都是同一個AD組的一部分,並且與其他人一樣擁有對共享/文件的權限。這兩個用戶登錄到另一臺機器上的應用程序,並執行相同的工作正常。我試着給兩個人完全控制和共享文件的所有權,但仍然是同樣的錯誤。卸載並重新安裝應用程序不起作用。

我登錄到每個受影響的用戶機和應用程序安裝在每個用戶的基礎上,但安裝和使用我的憑據運行在同一臺機器上的應用程序運行正常。

任何人有從以往的經驗建議這個問題,或者我應該嘗試下?

編輯:這一切都是在我們將共享文件夾移動到另一臺服務器時開始的。

+0

GDI +異常非常糟糕,但這幾乎總是一個權限問題。 100%確切地知道*文件正在寫入哪裏,並且用戶對服務器共享有適當的權限。而且他們試圖寫入的文件可能不會被網絡上的另一臺機器鎖定。 –

回答

0

您可以嘗試幾件事情:

  1. 當您從共享打開圖像,在內存中克隆它(創建一個新的Bitmap對象和複製所有的內容從原始圖像),並繼續工作這是內存中的對象。
  2. ...或在將圖像文件打開之前,將圖像文件從共享中物理複製到用戶計算機。
+0

這假設我有能力編輯應用程序。無論如何,該應用程序可以像所有其他用戶一樣正常工作,所以我不認爲代碼更改是適合的。不過謝謝。 – RobertMGlynn

+0

抱歉對你沒有意義,我的問題是完全不相關的,即時通訊只是在我的桌面上直接得到了這個錯誤,它讓我無法理解。 – blamb

1

有一個老的bug在.NET 2.0。但是,此錯誤僅在終端服務器或遠程桌面/協助會話下發生。

更多信息和解決方法: http://support.microsoft.com/kb/953389

更新一月2017微軟已經刪除了KB953389文章。它仍然在一些搜索引擎的緩存中。

這裏是什麼,是說:

行動

您正在運行Microsoft .NET Framework 2.0的Windows窗體在終端服務器會話的應用程序。然後,最小化終端服務器會話窗口,從會話斷開連接或鎖定會話。 結果

當在終端服務器會話恢復工作時,Windows窗體應用程序顯示以下異常和調用堆棧:

System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. 
    at System.Drawing.Graphics.Clear(Color color) 
    at System.Windows.Forms.ToolStripProfessionalRenderer.OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) 
    at System.Windows.Forms.ToolStripProfessionalRenderer.OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) 
    at System.Windows.Forms.ToolStripRenderer.DrawToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) 
    at System.Windows.Forms.ToolStripContentPanel.OnPaintBackground(PaintEventArgs e) 
    at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) 
    at System.Windows.Forms.Control.WmEraseBkgnd(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

原因

這是由於微軟的錯誤.NET Framework 2.0。 Windows窗體運行時正試圖調用System.Drawing.Graphics.Clear,而不檢查它是否在安全桌面上運行。如以下MSDN鏈接中所述,如果在終端服務器會話中的安全桌面上調用Clear方法,則可能會發生ExternalException,從而使Graphics對象處於不一致狀態。

Graphics.Clear方法

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.clear.aspx

分辨率

可以解決此問題由佈線事件處理程序的Application.ThreadException事件。此事件允許您的應用程序代碼處理Windows窗體線程中發生的其他未處理的異常。這將允許您的代碼被調用,而不是顯示標準的Windows窗體異常對話框。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    AddHandler Application.ThreadException, AddressOf Application_ThreadException 
End Sub 

Sub Application_ThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) 

    If TypeOf (e.Exception) Is System.Runtime.InteropServices.ExternalException Then 
     Return 
    End If 
    MessageBox.Show(e.Exception.Message, Me.Text) 
End Sub 
+0

B,以及鏈接被破壞,生病保持點,但是你能找到新的文章和修復鏈接? 至少這是我的領先,告訴我它的一個.NET問題,不知道是什麼造成了它。我只是想讓它消失。 – blamb