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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per