Scegliere la modalità utente o la modalità kernel
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.
L'esecuzione in modalità utente delle DLL grafiche della stampante offre i vantaggi seguenti rispetto all'esecuzione in modalità kernel:
Spazio dello stack illimitato.
Accesso alle API Win32.
Minore possibilità di causare arresti anomali del sistema.
Debug più semplice, con debugger in modalità utente.
Le funzionalità a virgola mobile migliori, poiché l'uso di funzioni A virgola mobile DDI grafica non è obbligatorio.
Possibilità di chiamare tutte le DLL personalizzate in modalità utente fornite dal fornitore che non fanno parte dell'architettura del driver della stampante microsoft Windows 2000 e versioni successive
In Windows Vista non è possibile installare un driver della stampante in modalità kernel. Se un'applicazione tenta di eseguire questa operazione, le funzioni AddPrinterDriver e AddprinterDriverEx (descritte nella documentazione di Windows SDK) avranno esito negativo con il codice di errore ERROR_KM_DRIVER_BLOCKED.
La tabella seguente mostra le modalità di esecuzione consentite del driver della stampante:
Versione del sistema operativo | Modalità di esecuzione consentita della DLL grafica della stampante |
---|---|
Windows NT 4.0 | kernel |
Windows 2000 | utente o kernel |
Windows XP e Server 2003 | modalità kernel disponibile per le stampanti esistenti; modalità utente necessaria per le nuove installazioni di stampanti |
Windows Vista | utente |
Uso dell'DDI grafica in modalità utente
Una DLL grafica della stampante in modalità utente non è limitata alla chiamata ai servizi di supporto GDI e ad altre funzioni di callback DDI con prefisso Eng. Esistono tuttavia alcune regole da seguire:
Come le DLL grafiche in modalità kernel, le DLL grafiche in modalità utente devono chiamare le DDI grafiche che creano o modificano una superficie di disegno. Queste funzioni di callback sono i servizi di supporto GDI e la chiamata di equivalenti Win32 di queste funzioni di disegno non è consentita.
Per le DLL in modalità utente, le chiamate a queste funzioni di callback di disegno vengono intercettate dal client GDI in modalità utente, che quindi passa le chiamate al motore di rendering grafico in modalità kernel (GRE) di GDI.
L'elenco seguente delle funzioni DDI con prefisso Eng non può essere chiamato da DLL in modalità utente:
Le DLL grafiche della stampante in modalità utente possono continuare a usare funzioni DDI grafiche per i servizi a virgola mobile GDI.
Conversione di una DLL grafica della stampante esistente in modalità utente
Se in precedenza è stata sviluppata una DLL grafica della stampante che viene eseguita in modalità kernel, è possibile convertire la DLL in esecuzione in modalità utente. Per eseguire la conversione, aggiungere una funzione DrvQueryDriverInfo alla DLL e quindi seguire le regole per la compilazione di una DLL grafica della stampante.
Creazione di una nuova DLL grafica della stampante in modalità utente
Per sviluppare una nuova DLL grafica della stampante eseguita in modalità utente, è possibile continuare a usare tutte le funzioni DDI grafiche usate dalle DLL in modalità kernel. Tuttavia, sono disponibili anche le opzioni seguenti:
Per le funzioni con prefisso Eng con equivalenti Win32 esatti, è consigliabile chiamare le funzioni Win32. La tabella seguente elenca queste funzioni con prefisso Eng, insieme ai relativi equivalenti Win32.
Funzione con prefisso Eng Equivalente win32 EngAllocMem HeapAlloc EngAllocUserMem HeapAlloc EngEnumForms EnumForms EngFreeMem HeapFree EngFreeUserMem HeapFree EngFindImageProcAddress GetProcAddress EngGetForm GetForm EngGetLastError GetLastError EngGetPrinter GetPrinter EngGetPrinterData GetPrinterData EngGetPrinterDriver GetPrinterDriver EngLoadImage LoadLibrary EngMulDiv MulDiv EngSetLastError SetLastError EngSetPrinterData SetPrinterData EngUnloadImage FreeLibrary EngWritePrinter WritePrinter Per le funzioni con prefisso Eng che corrispondono alle funzioni Win32 con funzionalità simili, è anche consigliabile chiamare le funzioni Win32. La tabella seguente elenca diverse di queste funzioni con prefisso Eng, insieme alle controparti Win32.
Funzione con prefisso Eng Equivalente win32 EngAcquireSemaphore EnterCriticalSection EngCreateSemaphore Allocare un oggetto CRITICAL_SECTION e inizializzarlo usando una chiamata alla funzione Win32 InitializeCriticalSection. EngDeleteSemaphore DeleteCriticalSection EngFindResource FindResource EngFreeModule FreeLibrary EngLoadModule LoadLibrary EngMultiByteToWideChar MultiByteToWideChar EngQueryLocalTime GetLocalTime EngReleaseSemaphore ReleaseSemaphore EngWideCharToMultiByte WideCharToMultiByte Per le funzioni che creano o modificano un servizio di disegno, i nuovi driver devono continuare a chiamare i servizi di supporto GDI e non i relativi equivalenti Win32.
Anziché usare funzioni DDI grafiche per i servizi a virgola mobile GDI, è possibile usare il tipo di dati FLOAT.