Share via


Scrittura di driver stampanti a 64 bit

Importante

È consigliabile 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 stampanti.

Per altre informazioni, vedere la guida alla progettazione dell'app di supporto 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 di conversione a 64 bit nella conversione del driver a Windows a 64 bit. Questo argomento descrive alcune delle limitazioni e dei problemi che potrebbero verificarsi durante la scrittura di un driver di stampante a 64 bit.

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

Limitazioni sugli handle del contesto del dispositivo

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

Problemi con la scrittura di driver a 64 bit

Nel codice 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 i computer a 32 bit, è possibile usare per presupporre che un valore del puntatore si adatta a una DWORD o A ULONG. Per il codice a 64 bit, questo presupposto è pericoloso. Se si esegue il cast di un puntatore per digitare 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 abbastanza grande per archiviare l'intero puntatore, indipendentemente dal fatto che il codice sia compilato per un computer a 32 bit o a 64 bit.

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

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

L'esempio di codice precedente esegue il cast del puntatore pData per digitare 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

L'esempio di codice precedente mantiene tutti i 64 bit del valore del puntatore.

Funzioni inline a 64 bit, ad esempio PtrToUlong e UlongToPtr , converte in modo sicuro tra i 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 segno o con zero, 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

È necessario 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 è preferito anche se

ulSlotPhysAddr

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