Загадочное сообщение вызвано ошибкой в pinvoke-коде внутри .NET Framework. Основной вызов winapi, который завершается неудачей, является DocumentProperties()
функцией . Декларация pinvoke для него выглядит так:
[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int DocumentProperties(...);
Свойство SetLastError
неверно. Как вы можете сказать по ссылке MSDN, функция сообщает об ошибке, возвращая отрицательное значение. И не задокументировано для установки кода ошибки, который возвращается GetLastError()
.
Следствием этой ошибки является то, что фреймворк вызовет Marshal.GetLastWin32Error()
для получения кода ошибки и получит случайное значение, поскольку DocumentProperties()
не установило его. Значение 0
весьма вероятно, что приводит к сообщению об исключении «Операция успешно завершена».
Так что вам нужно игнорировать сообщение об исключении; это очень бесполезно, конечно. К сожалению, эта функция winapi попадает в категорию функций, как и большинство функций GDI, которые выдают только код возврата «это не сработало». Это не дает подсказки, где искать проблему. Для этой причуды есть полуприличная причина: сама Windows делает очень мало, когда вы звоните DocumentProperties()
; большая часть работы выполняется драйвером принтера. Нет набора кодов ошибок, отведенных для печати в winapi. Все возможно: драйверы принтера не являются тонкими частями кода. Задача драйвера принтера - рассказать вам о проблемах. Они должны сделать это, открыв собственное окно. Теоретически они так или иначе; острая конкуренция в этом сегменте рынка не оставляет много денег, чтобы платить хорошую зарплату программиста в наши дни.
Это, конечно, не может работать при печати из службы. Нет такого способа увидеть такое всплывающее окно, что является основной причиной, по которой Microsoft настоятельно не рекомендует печатать из службы. Ни у вас, ни у ИТ-персонала вашего клиента нет возможности диагностировать проблемы. Прочтите это сообщение в блоге для получения дополнительных сведений об использовании PrintDocument
из службы.
Никто не любит получать такие советы, но надпись на стене. Не делай этого .