Condividi tramite


Scrittura di driver della stampante a 64 bit

Importante

La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.

Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.

Se si scrive un driver a 64 bit o si scrive un driver che può essere compilato per l'esecuzione in sistemi a 32 bit e a 64 bit, seguire le linee guida per la conversione a 64 bit in Conversione del driver in Windows a 64 bit. In questo argomento vengono descritte alcune limitazioni e problemi che potrebbero verificarsi durante la scrittura di un driver della stampante a 64 bit.

Per altre informazioni sull'uso delle decorazioni per identificare l'architettura a 64 bit, vedere gli argomenti seguenti:

Limitazioni per gli handle del contesto di dispositivo

Se un'applicazione a 32 bit è in esecuzione in una versione a 64 bit del sistema operativo Microsoft Windows, un plug-in del driver della stampante in esecuzione nel contesto del processo di Splwow64.exe di gestione dei pacchetti non deve chiamare la funzione CreateDC GDI. Questa chiamata avrà esito negativo.

Problemi con la scrittura di driver a 64 bit

Nel codice del driver a 32 bit esistente, prestare attenzione alle conversioni tra tipi di puntatore e tipi integer, ad esempio DWORD o ULONG. Se si ha esperienza nella scrittura di codice per computer a 32 bit, è possibile usare per presupporre che un valore del puntatore si adatti a una DWORD o A ULONG. Per il codice a 64 bit, questo presupposto è pericoloso. Se si esegue il cast di un puntatore al tipo DWORD o ULONG, un puntatore a 64 bit potrebbe essere troncato.

Eseguire invece il cast del puntatore per digitare DWORD_PTR o ULONG_PTR. Un intero senza segno di tipo DWORD_PTR o ULONG_PTR è sempre sufficientemente grande da archiviare l'intero puntatore, indipendentemente dal fatto che il codice venga compilato per un computer a 32 bit o a 64 bit.

Ad esempio, il campo puntatore pDrvOptItems.UserData nella struttura OEMCUIPPARAM è di tipo ULONG_PTR. Nell'esempio di codice seguente viene illustrato cosa non fare se si copia un valore del puntatore a 64 bit in questo campo.

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

Nell'esempio di codice precedente viene eseguito il cast del puntatore pData al tipo ULONG, che può troncare il valore del puntatore se sizeof(pData) sizeof(ULONG). > L'approccio corretto consiste nel eseguire il cast del puntatore a ULONG_PTR, come illustrato nell'esempio di codice seguente.

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

Nell'esempio di codice precedente vengono mantenuti tutti i 64 bit del valore del puntatore.

Le funzioni inline a 64 bit, ad esempio PtrToUlong e UlongToPtr , convertono in modo sicuro tra tipi puntatore e integer senza basarsi sui presupposti sulle dimensioni relative di questi tipi. Se un tipo è più breve dell'altro, deve essere esteso durante la conversione nel tipo più lungo. Se il tipo più breve viene esteso riempiendo con il bit del segno o con zeri, ogni funzione Win64 può gestire queste situazioni. Osservare l'esempio di codice seguente.

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

Sostituire l'esempio di codice precedente con l'esempio di codice seguente.

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

Il secondo esempio di codice è preferibile anche se

ulSlotPhysAddr

potrebbe rappresentare il valore di un registro hardware lungo solo 32 bit anziché di 64 bit. Per un elenco di tutte le nuove funzioni helper Win64 per la conversione tra tipi puntatore e integer, vedi Nuovi tipi di dati.