В GDI + произошла общая ошибка - PullRequest
1 голос
/ 20 июля 2011

У меня есть старое приложение Winforms, которое при использовании вызывает некоторые странные проблемы. Части приложения имеют дело с изображениями, пользователи могут добавлять изображения в запись, а размеры этих изображений изменяются в .Net и сохраняются на общем сервере. У меня две проблемы с использованием этого приложения, которые приводят к "общей ошибке в GDI +".

Пользователи могут просматривать записи, и изображения отображаются нормально, они могут пытаться печатать, и появляется диалоговое окно выбора принтера, но когда они нажимают кнопку печати, они получают ошибку. Другой случай, когда пользователи пытаются добавить новое изображение в запись, та же общая ошибка. Лучшая часть - только два пользователя имеют эту проблему.

Изображения могут быть открыты из общего ресурса напрямую и распечатаны, без проблем. Оба пользователя являются частью одной группы AD с разрешениями на общий ресурс / файлы, как и все остальные. Оба пользователя, входящие в приложение на другом компьютере и делающие то же самое, работают нормально. Я попытался предоставить двум людям полный контроль и владение общими файлами, но все же ошибка. Удаление и переустановка приложения не имеет никакого эффекта.

Я вошел на каждый компьютер, на который влияют пользователи, и приложение установлено отдельно для каждого пользователя, но установка и запуск приложения на том же компьютере с моими учетными данными работает нормально.

У кого-нибудь есть совет из предыдущего опыта с этой проблемой, или что мне следует попробовать дальше?

Редактировать: все это началось, когда мы переместили общую папку на другой сервер.

Ответы [ 2 ]

1 голос
/ 24 июля 2011

В .NET 2.0 есть старая ошибка.Однако эта ошибка возникает только в терминальном сервере или в сеансе удаленного рабочего стола / помощника.

Дополнительные сведения и обходные пути: http://support.microsoft.com/kb/953389

Обновление январь 2017 г. Microsoft удалилаСтатья KB953389Это все еще находится в кэше некоторых поисковых систем.

Вот что говорит:

Действие

Вы используете Microsoft .NET Framework2.0 Приложение Windows Forms в сеансе сервера терминалов.Затем вы минимизируете окно сеанса терминального сервера, отключаетесь от сеанса или блокируете сеанс.Результат

При возобновлении работы в сеансе сервера терминалов приложение Windows Forms отображает следующее исключение и стек вызовов:

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 Forms пытается вызвать 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 Forms.Это позволило бы вызывать ваш код вместо стандартного диалогового окна исключений Windows Forms.

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 голосов
/ 21 июля 2011

Вы можете попробовать несколько вещей:

  1. Когда вы откроете изображение из общего ресурса, клонируйте его в памяти (создайте новый объект Bitmap и скопируйте все содержимое из исходного изображения)и продолжить работу с этим объектом в памяти.
  2. ... или физически скопировать файл изображения из общего ресурса на компьютер пользователя, прежде чем открывать его для печати. ​​
...