Controle de versão do driver de impressão
Importante
A plataforma de impressão moderna é o meio preferido do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.
Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.
Minidrivers de impressora baseados em Unidrv e Pscript5, bem como drivers de impressora monolíticos (drivers desenvolvidos completamente por um IHV), devem usar o controle de versão do driver de impressora no Microsoft Windows XP e posterior. O spooler de impressão do Windows XP e posterior usa as informações de controle de versão para permitir que ele selecione os arquivos de driver corretos durante a instalação de uma nova versão do sistema operacional ou service pack, ou quando uma nova conexão de apontar e imprimir é estabelecida.
O controle de versão do driver de impressora não é suportado no Windows 2000 ou em versões anteriores do sistema operacional baseado em NT. Nessas versões do sistema operacional, o spooler de impressão baseia sua decisão de substituir um arquivo de driver específico apenas no carimbo de data/hora do arquivo. Um arquivo mais recente é sempre escolhido em preferência a um arquivo mais antigo, mesmo que o arquivo com a data mais recente possa ter o conjunto de recursos antigo. Como é tão fácil alterar a data de um arquivo, isso pode impedir que o spooler faça a escolha correta nos arquivos escolhidos.
Para garantir que as versões corretas dos arquivos de driver estejam instaladas, basta adicionar números de versão a esses arquivos. Você pode fazer isso fazendo pequenas modificações em pdrvver.h (que acompanha o Windows Driver Kit) e incluindo esse arquivo no arquivo de recurso DLL do driver de impressora. A configuração de um driver monolítico, usando a instalação baseada em INF, também se beneficia do controle de versão do driver, pois uma DLL mais recente não é substituída por uma DLL mais antiga, mesmo que a DLL mais antiga possa ter um carimbo de data/hora mais recente.
O cabeçalho pdrvver.h consiste quase exclusivamente em diretivas de #define pré-processador. Os dois primeiros, VER_FILETYPE e VER_FILESUBTYPE, que não devem ser modificados, indicam que o arquivo é um arquivo de recurso para um driver, especificamente um driver de impressora. As constantes VFT_DRV e VFT2_DRV_VERSIONED_PRINTER, que aparecem com VER_FILETYPE e VER_FILESUBTYPE, são descritas na estrutura VS_FIXEDFILEINFO. Os que você precisa alterar são os quatro últimos, que são os seguintes:
VER_FILEVERSION
Essa constante deve ser definida como uma sequência de quatro valores WORD delimitados por vírgulas. O terceiro e o quarto WORDs são usados para definir os WORDs altos e baixos, respectivamente, do membro dwFileVersionLS da estrutura VS_FIXEDFILEINFO.
O significado de cada uma das quatro PALAVRAS é descrito abaixo.
Primeiro WORD
Reservado. Esse valor deve ser definido como 0.
Segundo WORD
Representa a versão principal do driver. Para drivers de modo de usuário, defina isso como 0x0003. Para drivers no modo kernel, defina isso como 0x0002.
Terceiro WORD
Representa o número do conjunto de recursos com um byte alto e baixo.
Byte alto
Representa uma versão importante do conjunto de recursos. Supõe-se que uma versão mais recente tenha um superconjunto da funcionalidade da versão anterior. Incremente esse valor a cada nova versão principal.
Para minidrivers baseados em Unidrv e Pscript5 em execução no Windows XP e posterior, incluindo Windows Updates e Service Packs, isso deve ser definido como 0x05.
Byte baixo
Representa uma versão secundária do conjunto de recursos - uma nova versão da mesma base de código ou arquitetura. Incremente esse valor a cada nova versão menor.
Para minidrivers baseados em Unidrv e Pscript5 em execução nas seguintes versões do sistema operacional, esse byte deve ser definido conforme mostrado:
Windows XP: Defina como 0x01.
Primeiro Service Pack do Windows XP: definido como 0x01. (O número de correção de bug específico aparece no quarto WORD.)
Primeira atualização do Windows: defina como 0x02.
Fourth WORD
Representa uma correção de bug ou uma versão do service pack. Incremente esse valor na liberação de um novo binário, quando for uma coleção de correções de bugs ou um service pack.
Aqui está um exemplo de driver monolítico:
#define VER_FILEVERSION 0, 3, 0X0100, 0X0002
Em ordem, da esquerda para a direita, o primeiro valor WORD é zero, o que deve ser. O valor do segundo WORD é três, indicando que esse é um driver de modo de usuário. No terceiro WORD, o valor do byte alto (0X01) denota que esta é a primeira versão principal, e o byte baixo da mesma WORD (0x00) indica que não há, até o momento, nenhuma versão secundária. O quarto WORD (0x0002) indica que esta é a segunda correção de bug ou versão do service pack. (Nenhuma distinção é feita entre esses tipos de lançamentos.)
Aqui estão alguns exemplos de minidriver baseados em Unidrv/Pscript5:
#define VER_FILEVERSION 0, 3, 0X0501, 0X0001
Em ordem, da esquerda para a direita, o primeiro valor WORD é zero, como antes. O valor do segundo WORD é três, indicando que esse é um driver de modo de usuário. No terceiro WORD, os valores de byte alto e byte baixo (0X05 e 0x01, respectivamente) denotam que esta é uma versão para o Windows XP. O quarto WORD (0x0001) indica que esta é a primeira correção de bug ou versão do service pack.
#define VER_FILEVERSION 0, 3, 0X0502, 0X0000
Como antes, o primeiro WORD é zero e o segundo WORD indica que este é um minidriver de modo de usuário. O terceiro WORD (0x0502) indica que esta é a primeira versão do Windows Update lançada após o Windows XP. O quarto WORD (0x0000) indica que esta não é uma correção de bug nem uma versão de service pack.
VER_FILEDESCRIPTION_STR
Essa constante deve ser definida como um nome que identifique o driver, como no exemplo a seguir.
#define VER_FILEDESCRIPTION_STR "Sample Printer Driver Resource DLL"
VER_INTERNALNAME_STR
Defina essa constante como um nome que especifica o nome interno do arquivo (sem incluir o caminho), como no exemplo a seguir.
#define VER_INTERNALNAME_STR "SAMPLERES.DLL"
VER_ORIGINALFILENAME_STR
Defina essa constante como um nome que especifica o nome original do arquivo (sem incluir o caminho), como no exemplo a seguir.
#define VER_ORIGINALFILENAME_STR "SAMPLERES.DLL"