Общую проблему, которую вы формулируете, трудно решить. В основном драйвер принтера состоит из некоторых хорошо известных компонентов, таких как Print Monitor, Print Processor и т. Д., Которые хорошо документированы в Windows Driver Kit http://msdn.microsoft.com/en-us/library/ff560885%28v=VS.85%29.aspx. Несколько лет назад я написал Print Monitor. Он работал много лет на клиента. Так что я точно знаю, о чем пишу. Монитор печати - это не более, чем DLL с хорошо документированными функциями. То же самое касается большинства других компонентов принтера. Эти DLL будут загружены и вызваны из Spooler. Если у вас есть современный драйвер принтера, он не имеет компонентов, которые работают в режиме ядра. Таким образом, можно загрузить большинство библиотек DLL, из которых состоит каждый драйвер принтера, и вызвать соответствующую функцию .
.
Вам интересно использовать один драйвер концертного принтера . Итак, первое, что нужно сделать, это изучить , как реализован этот драйвер. Если вы узнаете, какой компонент выполняет ту работу, которая вам нужна, вы, вероятно, сможете загрузить эту DLL-библиотеку в свой процесс и получить нужный вам результат. Возможно, вы разместили URL, по которому я мог бы скачать этот драйвер?
ОБНОВЛЕНО : Я немного больше о ваших требованиях. Мне кажется, вы можете пойти по пути, предложенному разработчиком драйвера принтера. Если драйвер может печатать на локальный порт FILE, то он может печатать на любом порту принтера. Таким образом, вы можете указать src драйвера сервера мониторинга портов из C: \ WinDDK \ 7600.16385.1 \ src \ print \ monitors \ localmon (см. Также http://msdn.microsoft.com/en-us/library/ff556478%28v=VS.85%29.aspx, http://msdn.microsoft.com/en-us/library/ff549405%28v=VS.85%29.aspx и http://msdn.microsoft.com/en-us/library/ff563806%28v=VS.85%29.aspx). (Я - Windows 32/64 DLL, а не настоящий драйвер), и вносит небольшие изменения. Вместо сохранения результатов в файл, вы можете отправить результаты в ваше приложение. Это будет работать на 100% без каких-либо хитростей. Если вы будете есть некоторые проблемы, чтобы понять localmon Я могу дать вам несколько советов. Это действительно не сложно. Основные изменения, которые вы должны сделать, это изменить LcmStartDocPort
LcmWritePort
LcmReadPort
LcmEndDocPort
функций из localmon.c . Некоторая простая вещь, которая отличает Port DLL от обычной DLL, что вместо экспорта всех функций DLL она экспортирует только один InitializePrintMonitor2
с указателями на все другие функции.
ОБНОВЛЕНО 2 : Еще один совет по использованию монитора «Локальный порт». Если идет в конфигурации принтера, затем выберите «Добавить порт ...», выберите «Локальный порт» и нажмите «Новый порт ...», вы можете ввести любое имя файла, например, «C: \ temp \ my.bin». Тогда все, что вы печатаете через принтер, будет напечатано в этом файле без какой-либо пользовательской итерации. Имя может быть любое имя файла win32 (также допускаются имена UNC или именованные каналы). Таким образом, вы можете реализовать некоторые сценарии без программирования с DDK.
ОБНОВЛЕНО 3 : Я посмотрел на драйвер принтера с разных сторон и еще раз посмотрел на API в DDK. Теперь я хочу порекомендовать вам выбрать самый простой способ, и тот, который будет полностью поддерживаться производителем драйвера. Я предлагаю следующее:
Вы устанавливаете принтер с необходимым драйвером и выбираете в качестве выходного порта Локальный порт с фиксированным именем файла (см. Обновление 2). Я назвал здесь имя файла назначения как C: \ TEMP \ Output.afp . Таким образом, вы получите точно такую же ситуацию, как рекомендованный вами драйвер производителя. Фиксированное имя файла абсолютно совпадает с FILE: port. Поэтому, если вы печатаете на принтере, вы получаете файл Output.afp в каталоге C: \ TEMP . Чтобы быть уверенным в конце написания вы можете использовать функции ReadDirectoryChangesW
или FindNextChangeNotification
/ FindFirstChangeNotification
с dwNotifyFilter
, равным FILE_NOTIFY_CHANGE_LAST_WRITE
. Затем вы получите уведомление после последнего времени записи файла. Это означает, что после окончания записи и после FileClose
и после того, как кеш достаточно очищен. Таким образом, файл Output.afp не заблокирован, и вы можете действительно безопасно прочитать результаты.
Для печати простых документов вы можете использовать функцию WritePrinter
(см. http://msdn.microsoft.com/en-us/library/dd162959%28VS.85%29.aspx и примечание в документации http://msdn.microsoft.com/en-us/library/dd145226%28VS.85%29.aspx). Запись сложных файлов с растровыми изображениями, цветными и различными шрифтами, которые вы должны использовать типичныеGDI API похож на этот в Windows (см. http://msdn.microsoft.com/en-us/library/dd162865%28v=VS.85%29.aspx).
. Это решение выглядит не очень эффектно, как написание компонента драйвера принтера или имитация среды диспетчера очереди для драйвера принтера, но оно будет работать, будет работать безопасно и будет работатьбыть полностью поддерживаемым производителем драйвера.