Поделиться через


Печать управления версиями драйверов

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Мини-накопители принтера на основе Unidrv и Pscript5, а также монолитные драйверы принтера (драйверы, разработанные полностью IHV), должны использовать управление версиями драйверов принтера в Microsoft Windows XP и более поздних версиях. Средство spooler печати Windows XP и более поздних версий использует сведения о версиях, чтобы разрешить ему выбрать правильные файлы драйверов во время установки новой версии операционной системы или пакета обновления или при установке нового подключения "Точка и печать".

Управление версиями драйверов принтера не поддерживается в windows 2000 или предыдущих версиях операционной системы на основе NT. В этих версиях операционной системы средство проверки печати основывает свое решение о том, следует ли заменить конкретный файл драйвера исключительно на метке времени файла. Новый файл всегда выбирается в предпочтениях к старому файлу, даже если файл с более новой датой может иметь старый набор компонентов. Так как так легко изменить дату файла, это может предотвратить правильный выбор в файлах, которые он выбирает.

Чтобы убедиться, что установлены правильные версии файлов драйверов, просто добавьте номера версий в эти файлы. Это можно сделать, внесите незначительные изменения в pdrvver.h (который поставляется с комплектом драйверов Windows) и в том числе этот файл в файле ресурсов DLL драйвера принтера. Настройка монолитного драйвера, использующий установку НА основе INF, также обеспечивает преимущества управления версиями драйверов, так как более новая библиотека DLL не перезаписывается более старой библиотекой DLL, даже если более старая библиотека DLL может иметь более новую метку времени.

Заголовок pdrvver.h состоит почти исключительно из директив препроцессора #define. Первые два, VER_FILETYPE и VER_FILESUBTYPE, которые не должны быть изменены, указывают на то, что файл является файлом ресурсов для драйвера, в частности драйвером принтера. Константы VFT_DRV и VFT2_DRV_VERSIONED_PRINTER, которые отображаются с VER_FILETYPE и VER_FILESUBTYPE, описаны в структуре VS_FIXEDFILEINFO. Те, которые необходимо изменить, являются последними четырьмя, которые являются следующими:

VER_FILEVERSION

Эта константа должна иметь последовательность из четырех значений WORD с разделителями-запятыми. Третий и четвертый WORD используются для задания высоких и низких WORD соответственно элемента dwFileVersionLS структуры VS_FIXEDFILEINFO.

Значение каждого из четырех WORD описано ниже.

Первое СЛОВО

Зарезервировано. Это значение должно иметь значение 0.

Второе СЛОВО

Представляет основную версию драйвера. Для драйверов пользовательского режима задайте для этого значение 0x0003. Для драйверов в режиме ядра задайте для этого значение 0x0002.

Третье СЛОВО

Представляет номер набора функций с высоким и низким байтом.

Высокий байт

Представляет основной выпуск набора компонентов. Предполагается, что более новый выпуск имеет супермножество функций предыдущего выпуска. Увеличьте это значение с каждым новым основным выпуском.

Для мини-накопителей на основе Unidrv и Pscript5, работающих в Windows XP и более поздних версиях, включая Обновл. Windows и пакеты обновления, этот параметр должен быть установлен на 0x05.

Низкий байт

Представляет дополнительный выпуск набора компонентов — новый выпуск из той же базы кода или архитектуры. Увеличьте это значение с каждым новым дополнительным выпуском.

Для мини-накопителей на основе Unidrv и Pscript5, работающих в следующих выпусках операционной системы, этот байт должен быть задан, как показано ниже.

  • Windows XP: установите значение 0x01.

  • Первый пакет обновления Windows XP: установите значение 0x01. (Конкретный номер исправления ошибок отображается в четвертом WORD.)

  • Сначала Обновл. Windows: установите значение 0x02.

Четвертое СЛОВО

Представляет исправление ошибки или выпуск пакета обновления. Приращение этого значения к выпуску нового двоичного файла, когда это коллекция исправлений ошибок или пакета обновления.

Ниже приведен пример монолитного драйвера:

#define VER_FILEVERSION    0, 3, 0X0100, 0X0002

В порядке, левом направо, первое значение WORD равно нулю, которое должно быть. Значение второго WORD — три, указывающее, что это драйвер пользовательского режима. В третьем word значение высокого байта (0X01) указывает, что это первый основной выпуск, а низкий байт одного и того же WORD (0x00) указывает, что пока нет дополнительных выпусков. Четвертый word (0x0002) указывает, что это второе исправление ошибок или выпуск пакета обновления. (Различия между этими типами выпусков не различаются.)

Ниже приведены некоторые примеры мини-driver на основе Unidrv-/Pscript5:

#define VER_FILEVERSION    0, 3, 0X0501, 0X0001

В порядке, левом направо, первое значение WORD равно нулю, как и раньше. Значение второго WORD — три, указывающее, что это драйвер пользовательского режима. В третьем word высокие и низкие байтовые значения (0X05 и 0x01 соответственно) указывают, что это выпуск для Windows XP. Четвертый word (0x0001) указывает, что это первое исправление ошибок или выпуск пакета обновления.

#define VER_FILEVERSION    0, 3, 0X0502, 0X0000

Как и раньше, первый word равен нулю, а второй word указывает, что это мини-driver в пользовательском режиме. Третий word (0x0502) указывает, что это первая Обновл. Windows версия, выпущенная после Windows XP. Четвертый word (0x0000) указывает, что это ни исправление ошибок, ни выпуск пакета обновления.

VER_FILEDESCRIPTION_STR

Эта константа должна иметь имя, определяющее драйвер, как показано в следующем примере.

#define VER_FILEDESCRIPTION_STR    "Sample Printer Driver Resource DLL"

VER_INTERNALNAME_STR

Задайте для этой константы имя, указывающее внутреннее имя файла (не включая путь), как показано в следующем примере.

#define VER_INTERNALNAME_STR    "SAMPLERES.DLL"

VER_ORIGINALFILENAME_STR

Задайте для этой константы имя, указывающее исходное имя файла (не включая путь), как показано в следующем примере.

#define VER_ORIGINALFILENAME_STR    "SAMPLERES.DLL"