我有一个传统的Winforms应用程序,在使用它时会导致一些奇怪的问题。应用程序的某些部分处理图像,用户可以将图像添加到记录中,这些图像在.Net中调整大小并保存到服务器共享。我在使用这个应用程序时遇到两个问题,导致“GDI +中出现一般错误”。
用户可以查看记录并且图像显示正常,他们可以尝试打印并出现选择打印机的对话框,但是当他们点击打印时,他们会收到错误。另一种是当用户尝试将新图像添加到记录时,相同的一般错误。最好的部分 - 只有两个用户有这个问题。
图像可以直接从共享打开并打印,没问题。这两个用户都是同一个AD组的一部分,并且与其他人一样拥有共享/文件的权限。两个用户登录到另一台计算机上的应用程序并执行相同的工作正常。我试过让两个人对共享文件有完全的控制权和所有权,但仍然是同样的错误。卸载并重新安装应用程序无效。
我已登录每个受影响的用户计算机,并且该应用程序是基于每个用户安装的,但使用我的凭据在同一台计算机上安装和运行该应用程序运行正常。
任何人都有过这个问题的经验,或者我接下来要尝试的建议吗?
编辑:这一切都是在我们将共享文件夹移动到另一台服务器时开始的。
答案 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)
您可以尝试以下几种方法:
Bitmap
对象并复制原始图像中的所有内容)并继续使用该内存中对象。