У меня есть приложение, которому необходимо печатать файлы разных типов, используя связанные с ними приложения для печати с использованием ShellExecute и глагола «печать». Мое приложение должно (надеюсь) надежно знать, когда одно задание на печать полностью обработано, и оно может выдать следующее. Я выполняю это с помощью FindNextPrinterChangeNotification, и все работает нормально, используя локальные принтеры, например. установлен через USB, но я получаю совершенно другое поведение, если задействованы сетевые принтеры.
Один из моих клиентов использовал мое приложение с сетевым принтером, то есть профессиональным принтером со встроенным сервером печати, установленным на Windows Server 2008 R2, и делился этим установленным принтером с помощью Windows со своими клиентами. В этом сценарии FindNextPrinterChangeNotification всегда возвращал успех, но возвращаемые структуры также всегда имели установленный флаг PRINTER_NOTIFY_INFO_DISCARDED. Я мог воспроизвести это поведение с помощью Windows Server 2008 R2 самостоятельно, который не экспортировал принтер с собственным встроенным сервером печати, а просто локально установил FreePDF XP. Кроме того, я получаю такое же поведение, если я использую samba, cups и cups-pdf на одном из наших серверов разработки Ubuntu: Samba успешно экспортирует принтер cups-pdf, и если я устанавливаю его на своем компьютере для разработки Windows 7 и использую его с моей печатью приложение, FindNextPrinterChangeNotification всегда успешно возвращается, но снова всегда с установленным флагом PRINTER_NOTIFY_INFO_DISCARDED.
После этого мой клиент установил свой принтер напрямую через встроенный сервер печати принтера для своих клиентов и сказал мне, что мое приложение для печати теперь работает как с локальным принтером. Это означает, что больше нет событий с установленным флагом PRINTER_NOTIFY_INFO_DISCARDED, так как в его версии моего приложения это состояние ошибки, которое приведет к выходу из приложения.
Я снова попытался воспроизвести это с помощью cups-pdf, на этот раз я не устанавливал принтер, экспортированный Samba, а напрямую указав имя принтера cups, используя URL-адрес http://domain.example.org.:631/printers/PDF. Я могу успешно использовать этот принтер в Windows, но мое приложение снова получает странные события. На этот раз я не получаю результатов с установленным флагом PRINTER_NOTIFY_INFO_DISCARDED, но ppPrinterNotifyInfo всегда имеет значение NULL, я вообще не получаю никаких результатов, но FindNextPrinterChangeNotification успешно возвращается.
Microsoft предоставляет примечание о брандмауэрах и уведомлениях о принтерах, которые могут быть заблокированы клиентами, но я не думаю, что это проблема в моем случае, потому что я уже тестировал те же сценарии с отключенным брандмауэром, с включенным брандмауэром результаты различаются в зависимости от того, насколько моя машина для разработки взаимодействует с принтерами, а настройки брандмауэра Windows 7, по-видимому, разрешают связь с принтером по умолчанию.
Короче говоря: я ничего не нашел о том, насколько надежны уведомления принтера для разных сетевых принтеров. Все ли зависит от драйверов принтера? Не похоже, потому что это имеет значение, если Samba экспортирует принтер или использует http напрямую. Из того, что я прочитал, Windows 7 использует клиентский рендеринг заданий на печать, а затем отправляет задания в сетевой диспетчер очереди печати, я могу видеть эти задания в своем локальном диспетчере очереди в течение длительного времени. Почему я тоже не получаю уведомления? Разве Samba и принтеры, совместно использующие Windows Server, не должны публиковать уведомления о принтерах? Я не мог найти никакой информации, говорящей об этом.
Я был бы очень признателен за любую помощь или подсказки для документов, которые могли бы пролить свет на это. Спасибо!