Partilhar via


Criação de drivers de impressora de 64 bits

Importante

A moderna plataforma de impressão é o meio preferido do Windows para comunicar com as impressoras. Recomendamos que utilize o controlador de classe da caixa de entrada IPP da Microsoft, juntamente com as Aplicações de Suporte de Impressão (PSA), 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 o guia de design do aplicativo de suporte Print.

Se você estiver escrevendo um driver de 64 bits ou um driver que possa ser compilado para ser executado em sistemas de 32 bits e 64 bits, siga as diretrizes de portabilidade de 64 bits em Portando seu driver para o Windows de 64 bits. Este tópico descreve algumas das limitações e problemas que você pode encontrar ao escrever um driver de impressora de 64 bits.

Para obter mais informações sobre como usar decorações para identificar a arquitetura de 64 bits, consulte os seguintes tópicos:

Limitações nos identificadores de contexto do dispositivo

Se um aplicativo de 32 bits estiver sendo executado em uma versão de 64 bits do sistema operacional Microsoft Windows, um plug-in de driver de impressora que esteja sendo executado no contexto do processo de bloqueio de Splwow64.exe não deve chamar a função GDI CreateDC; Esta chamada falhará.

Problemas com a escrita de drivers de 64 bits

No código de driver de 32 bits existente, tenha cuidado com conversões entre tipos de ponteiro e tipos inteiros, como DWORD ou ULONG. Se você tiver experiência em escrever código para máquinas de 32 bits, pode estar acostumado a assumir que um valor de ponteiro se encaixa em um DWORD ou ULONG. Para código de 64 bits, essa suposição é perigosa. Se você lançar um ponteiro para digitar DWORD ou ULONG, um ponteiro de 64 bits poderá ser truncado.

Em vez disso, lance o ponteiro para digitar DWORD_PTR ou ULONG_PTR. Um inteiro não assinado do tipo DWORD_PTR ou ULONG_PTR é sempre grande o suficiente para armazenar o ponteiro inteiro, independentemente de o código ser compilado para um computador de 32 bits ou 64 bits.

Por exemplo, o campo de ponteiro pDrvOptItems.UserData na estrutura OEMCUIPPARAM é do tipo ULONG_PTR. O exemplo de código a seguir mostra o que não fazer se você copiar um valor de ponteiro de 64 bits para este campo.

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG)pData;  // Wrong

O exemplo de código anterior converte o ponteiro pData para digitar ULONG, que pode truncar o valor do ponteiro se sizeof(pData) >sizeof(ULONG). A abordagem correta é converter o ponteiro para ULONG_PTR, como mostrado no exemplo de código a seguir.

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG_PTR)pData;  // Correct

O exemplo de código anterior preserva todos os 64 bits do valor do ponteiro.

Funções em linha de 64 bits, como PtrToUlong e UlongToPtr, convertem com segurança entre tipos de ponteiro e inteiro sem depender de suposições sobre os tamanhos relativos desses tipos. Se um tipo é mais curto do que o outro, ele deve ser estendido ao converter para o tipo mais longo. Se o tipo mais curto for estendido preenchendo com o bit de sinal ou com zeros, então cada função Win64 pode lidar com essas situações. Considere o exemplo de código a seguir.

ULONG ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = ULONG(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // wrong

Você deve substituir o exemplo de código anterior pelo exemplo de código a seguir.

ULONG_PTR ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = PtrToUlong(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // correct

O segundo exemplo de código é preferido, embora

ulSlotPhysAddr

pode representar o valor de um registro de hardware que tem apenas 32 bits de comprimento em vez de 64 bits de comprimento. Para obter uma lista de todas as novas funções auxiliares do Win64 para conversão entre tipos de ponteiro e inteiro, consulte Novos tipos de dados.