Criando drivers de impressora de 64 bits
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.
Se você estiver escrevendo um driver de 64 bits ou escrevendo 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 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 em identificadores de contexto do dispositivo
Se um aplicativo de 32 bits estiver em execução em uma versão de 64 bits do sistema operacional Microsoft Windows, um plug-in de driver de impressora em execução no contexto do processo de conversão de Splwow64.exe não deverá chamar a função GDI CreateDC; essa chamada falhará.
Problemas com a gravação de drivers de 64 bits
No código de driver de 32 bits existente, tenha cuidado com as conversões entre tipos de ponteiro e tipos inteiros, como DWORD ou ULONG. Se você tiver experiência em escrever código para computadores de 32 bits, talvez esteja acostumado a supor que um valor de ponteiro se encaixa em um DWORD ou ULONG. Para código de 64 bits, essa suposição é perigosa. Se você converter um ponteiro para o tipo DWORD ou ULONG, um ponteiro de 64 bits poderá ser truncado.
Em vez disso, converta o ponteiro para digitar DWORD_PTR ou ULONG_PTR. Um inteiro sem sinal 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 esse campo.
PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG)pData; // Wrong
O exemplo de código anterior converte o ponteiro pData para o tipo ULONG, que pode truncar o valor do ponteiro se sizeof(pData) >sizeof(ULONG). A abordagem correta é converter o ponteiro para ULONG_PTR, conforme 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 embutidas de 64 bits, como PtrToUlong e UlongToPtr, convertem com segurança entre tipos de ponteiro e inteiros sem depender de suposições sobre os tamanhos relativos desses tipos. Se um tipo for mais curto que o outro, ele deverá 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, cada função Win64 poderá 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 com apenas 32 bits em vez de 64 bits. 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.