Работая с образцом пакета Windows Driver Development Kit (v 8.1), я нашел образец реализации процессора печати, который я попытался использовать в качестве отправной точки для своего собственного пользовательского процессора печати («Образец процесса печати GenPrint»). Мне удалось успешно построить его в сообществе Visual Studio 2017 (изменив PlatformToolset на «v141»), и я, очевидно, смог успешно установить его (создав элемент реестра «HKLM: \ SYSTEM \ CurrentControlSet \ Control \ Print \ Environments» \ Windows x64 \ Print Processors \ genprint «со свойством элемента» Driver «и значением» genprint.dll «, а также копирование недавно созданной dll в% WinDir% / System32 / spool / prtprocs / x64 /). Затем я могу настроить тестовый принтер и выбрать свой процессор печати «genprint», используя «Свойства принтера»> «Дополнительно»> «Процессор печати», и даже могу подключиться к процессу спулера, spoolsv, из моего отладчика в Visual Studio и установить точку останова. в EnumPrintProcessorDatatypesW (…) и увидите, что его ударили, когда я снова открою диалоговое окно «Процессор печати» для моего тестового принтера. Все идет нормально!
Проблема возникает, когда я устанавливаю точку останова где-нибудь еще, и поставить в очередь фактическое задание в очередь принтера. Скажите в начале OpenPrintProcessor (…). Или PrintDocumentOnPrintProcessor (…), или, назовите его. Ничего, нада, пшик. Кажется, эти функции просто никогда не звонил вообще, по крайней мере, не реализации, экспортированные моей DLL. Я даже прибегал к вставке журналов событий, а именно трассировки событий для Windows (ETW) в начале каждой функции, экспортируемой DLL, но единственные когда-либо созданные журналы — это журналы для EnumPrintProcessorDatatypesW (…).
Что на земле может происходить ?? Возможно ли, что по какой-то странной причине спулер использует разные процессор печати, чем мой, хотя я явно связал мой с рассматриваемой очередью печати? И если так, то почему?
[Обновление: похоже, что поведение, которое я вижу, сводится к «изоляции драйвера принтера»; когда я изменяю режим изоляции для драйвера, связанного с очередью, на «Нет», тогда я могу подключиться к процессу spoolsv. В противном случае мой процессор печати работает в отдельном процессе, связывающемся с spoolsv через DCOM, как описано в разделе: https://blogs.technet.microsoft.com/askperf/2009/10/08/windows-7-windows-server-2008-r2-print-driver-isolation/ — Я предполагаю, что общесистемное значение по умолчанию было изменено для использования изоляции драйвера принтера начиная с Windows 7, если только вы явно не сконфигурируете драйвер на «Нет» (или он сам настраивается таким образом)]Задача ещё не решена.
Других решений пока нет …