Общая ошибка в GDI+

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

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

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

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

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

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


person RobertMGlynn    schedule 20.07.2011    source источник
comment
Исключения GDI+ довольно паршивы, но это почти всегда проблема с правами доступа. Убедитесь на 100%, что вы точно знаете, куда записывается файл, и что у пользователя есть соответствующие права на общий ресурс сервера. И что файл, в который они пытаются записать, не может быть заблокирован другим компьютером в сети.   -  person Hans Passant    schedule 20.07.2011


Ответы (2)


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

Дополнительная информация и обходной путь: http://support.microsoft.com/kb/953389.

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

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

Действие

Вы запускаете приложение Microsoft .NET Framework 2.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
person Maris B.    schedule 24.07.2011
comment
Б, ну ссылка битая, я не в курсе, но вы можете найти новую статью и исправить ссылку? По крайней мере, это зацепка для меня, говорит мне, что это проблема .NET, не знаю, что ее вызывает. Я просто хочу, чтобы это исчезло. - person blamb; 19.01.2017

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

  1. Когда вы открываете изображение из общей папки, клонируйте его в память (создайте новый объект Bitmap и скопируйте все содержимое исходного изображения) и продолжайте работать с этим объектом в памяти.
  2. ... или физически скопируйте файл изображения с общего ресурса на компьютер пользователя, прежде чем открывать его для печати.
person Igor Brejc    schedule 21.07.2011
comment
Это предполагает, что у меня есть возможность редактировать приложение. Несмотря на это, приложение работает нормально, как и для всех других пользователей, поэтому я не думаю, что здесь уместно изменение кода. Спасибо хоть. - person RobertMGlynn; 26.07.2011
comment
извините, для вас нет смысла, моя проблема совершенно не связана, я просто получаю эту ошибку прямо на своем рабочем столе, она меня чертовски раздражает. - person blamb; 19.01.2017