GDI +中发生了一般错误

时间:2011-07-20 16:16:54

标签: windows winforms active-directory gdi+

我有一个传统的Winforms应用程序,在使用它时会导致一些奇怪的问题。应用程序的某些部分处理图像,用户可以将图像添加到记录中,这些图像在.Net中调整大小并保存到服务器共享。我在使用这个应用程序时遇到两个问题,导致“GDI +中出现一般错误”。

用户可以查看记录并且图像显示正常,他们可以尝试打印并出现选择打印机的对话框,但是当他们点击打印时,他们会收到错误。另一种是当用户尝试将新图像添加到记录时,相同的一般错误。最好的部分 - 只有两个用户有这个问题。

图像可以直接从共享打开并打印,没问题。这两个用户都是同一个AD组的一部分,并且与其他人一样拥有共享/文件的权限。两个用户登录到另一台计算机上的应用程序并执行相同的工作正常。我试过让两个人对共享文件有完全的控制权和所有权,但仍然是同样的错误。卸载并重新安装应用程序无效。

我已登录每个受影响的用户计算机,并且该应用程序是基于每个用户安装的,但使用我的凭据在同一台计算机上安装和运行该应用程序运行正常。

任何人都有过这个问题的经验,或者我接下来要尝试的建议吗?

编辑:这一切都是在我们将共享文件夹移动到另一台服务器时开始的。

2 个答案:

答案 0 :(得分:1)

.NET 2.0中存在一个旧错误。但是,此错误仅在终端服务器或远程桌面/协助会话中发生。

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

2017年1月更新。 Microsoft已删除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)

<强>原因

这是由于Microsoft .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

答案 1 :(得分:0)

您可以尝试以下几种方法:

  1. 从共享中打开图像时,将其克隆到内存中(创建一个新的Bitmap对象并复制原始图像中的所有内容)并继续使用该内存中对象。
  2. ...或者将图像文件从共享中物理复制到用户的计算机,然后再打开它进行打印。