Scegliere la modalità utente o la modalità kernel

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.

L'esecuzione in modalità utente delle DLL della grafica della stampante offre i vantaggi seguenti per l'esecuzione in modalità kernel:

  • Spazio dello stack illimitato.

  • Accesso alle API Win32.

  • Meno potenziale per causare arresti anomali del sistema.

  • Debug più semplice, con debugger in modalità utente.

  • Funzionalità a virgola mobile migliori, poiché l'uso delle funzioni A virgola mobile DDI grafica non è necessario.

  • Possibilità di chiamare le DLL in modalità utente personalizzate fornite dal fornitore che non fanno parte dell'architettura descritta di 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 del driver della stampante consentite:

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 in modalità utente non è limitata alla chiamata ai servizi di supporto GDI e ad altre funzioni di callback DDI con prefisso DDI. Esistono tuttavia alcune regole che devono essere seguite:

  • Analogamente alle DLL grafiche in modalità kernel, le DLL grafiche in modalità utente devono chiamare le DDI grafiche che creano o modificano un'area 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 della grafica in modalità kernel di GDI (GRE).

  • L'elenco seguente di funzioni DDI grafiche prefissi di Eng non può essere chiamato dalle DLL in modalità utente:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • Le DLL 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 convertire, 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 esatte, è consigliabile chiamare le funzioni Win32. La tabella seguente elenca queste funzioni con prefisso Eng, insieme ai relativi equivalenti Win32.

    Funzione prefissi di 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, è consigliabile chiamare anche le funzioni Win32. Nella tabella seguente sono elencate diverse di queste funzioni con prefisso Eng, insieme alle controparti Win32.

    Funzione prefissi di 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 servizi di Floating-Point GDI, è possibile usare il tipo di dati FLOAT.