Как уведомления принтера в Windows должны работать с сетевыми принтерами?

У меня есть приложение, которому необходимо печатать файлы разных типов, используя связанные с ними приложения для печати с использованием 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, не должны публиковать уведомления о принтерах? Я не мог найти никакой информации, говорящей об этом.

Я был бы очень признателен за любую помощь или подсказки для документов, которые могли бы пролить свет на это. Спасибо!


person Thorsten Schöning    schedule 03.09.2013    source источник
comment
Сервер печати и клиент должны находиться в одном домене AD или иметь явный доступ с помощью команды «net use». Пожалуйста, ознакомьтесь с дополнительной информацией об анонимном доступе к именованным каналам в Windows и аутентификации удаленного доступа к принтеру.   -  person Brian Cannard    schedule 18.11.2013
comment
Я не использовал AD в своих тестах, и я почти уверен, что мой пользователь, с которым я тестировал, имел полный доступ к общему ресурсу принтера, по крайней мере, он был создан на сервере. Мой локальный диспетчер очереди печати показывал мне состояние моего задания на печать, только с помощью API я не получал той же информации, что и с локальными или сетевыми принтерами, которые не были разделены с помощью Samba или Windows Server.   -  person Thorsten Schöning    schedule 18.11.2013