Wählen Sie den Benutzermodus oder den Kernelmodus
Wichtig
Die moderne Druckplattform ist die bevorzugte Methode von Windows für die Kommunikation mit Druckern. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.
Weitere Informationen finden Sie unter Moderne Druckplattform und im Designhandbuch für die Drucksupport-App.
Die Ausführung von Druckergrafik-DLLs im Benutzermodus bietet die folgenden Vorteile gegenüber der Kernelmodusausführung:
Unbegrenzter Stapelplatz.
Zugriff auf Win32-APIs.
Geringere Gefahr von Systemausfällen.
Einfacheres Debuggen mit Debuggern im Benutzermodus.
Bessere Gleitkommafunktionen, da die Verwendung von Grafik-DDI-Gleitkommafunktionen nicht erforderlich ist.
Möglichkeit, benutzerdefinierte, vom Hersteller bereitgestellte Benutzermodus-DLLs aufzurufen, die nicht Teil der beschriebenen Architektur von Microsoft Windows 2000 und höherer Druckertreiber sind
In Windows Vista ist es nicht möglich, einen Druckertreiber für den Kernelmodus zu installieren. Wenn eine Anwendung versucht, dies zu tun, schlagen die Funktionen AddPrinterDriver und AddprinterDriverEx (beschrieben in der Windows SDK-Dokumentation) mit dem Fehlercode ERROR_KM_DRIVER_BLOCKED fehl.
Die folgende Tabelle zeigt die zulässigen Ausführungsmodi des Druckertreibers:
Betriebssystemversion | Zulässiger Ausführungsmodus der Druckergrafik-DLL |
---|---|
Windows NT 4.0 | kernel |
Windows 2000 | Benutzer oder Kernel |
Windows XP und Server 2003 | Kernelmodus für vorhandene Drucker verfügbar; Benutzermodus erforderlich für neue Druckerinstallationen |
Windows Vista | user |
Verwenden der Grafik-DDI im Benutzermodus
Eine Druckergrafik-DLL im Benutzermodus ist nicht auf das Aufrufen der GDI-Supportdienste und anderer DDI-Rückruffunktionen mit Präfixgrafiken beschränkt. Es gibt jedoch einige Regeln, die befolgt werden müssen:
Wie Kernelmodus-Grafik-DLLs müssen Grafik-DLLs im Benutzermodus die Grafik-DDIs aufrufen, die eine Zeichnungsoberfläche erstellen oder ändern. Diese Rückruffunktionen sind die GDI-Supportdienste, und das Aufrufen von Win32-Entsprechungen dieser Zeichenfunktionen ist nicht zulässig.
Für DLLs im Benutzermodus werden Aufrufe dieser Zeichnungsrückruffunktionen vom Benutzermodus-GDI-Client abgefangen, der dann die Aufrufe an das Kernelmodus-Grafikrenderingmodul (GRE) von GDI übergibt.
Die folgende Liste der DDI-Funktionen mit Eng-Präfixgrafiken kann nicht von DLLs im Benutzermodus aufgerufen werden:
Druckergrafik-DLLs im Benutzermodus können weiterhin DDI-Grafikfunktionen für GDI-Gleitkommadienste verwenden.
Konvertieren einer vorhandenen Druckergrafik-DLL in den Benutzermodus
Wenn Sie zuvor eine Druckergrafik-DLL entwickelt haben, die im Kernelmodus ausgeführt wird, können Sie die DLL in die Ausführung des Benutzermodus konvertieren. Zum Konvertieren fügen Sie der DLL eine DrvQueryDriverInfo-Funktion hinzu, und befolgen Sie dann die Regeln zum Erstellen einer Druckergrafik-DLL.
Erstellen einer neuen Druckergrafik-DLL im Benutzermodus
Um eine neue Druckergrafik-DLL zu entwickeln, die im Benutzermodus ausgeführt wird, können Sie weiterhin alle Grafik-DDI-Funktionen verwenden, die von Kernelmodus-DLLs verwendet werden. Sie haben jedoch auch die folgenden Optionen:
Für Eng-Präfix-Funktionen mit exakten Win32-Entsprechungen wird empfohlen, die Win32-Funktionen aufzurufen. In der folgenden Tabelle sind diese Eng-Präfix-Funktionen zusammen mit ihren Win32-Entsprechungen aufgeführt.
Eng-Präfix-Funktion Win32-Entsprechung 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 Bei Eng-Präfix-Funktionen, die Win32-Funktionen mit ähnlicher Funktionalität entsprechen, empfiehlt es sich auch, die Win32-Funktionen aufzurufen. In der folgenden Tabelle sind mehrere dieser Eng-Präfix-Funktionen zusammen mit ihren Win32-Gegenstücken aufgeführt.
Eng-Präfix-Funktion Win32-Entsprechung EngAcquireSemaphore EnterCriticalSection EngCreateSemaphore Weisen Sie ein CRITICAL_SECTION-Objekt zu, und initialisieren Sie es mithilfe eines Aufrufs der Win32 InitializeCriticalSection-Funktion. EngDeleteSemaphore DeleteCriticalSection EngFindResource Findresource EngFreeModule FreeLibrary EngLoadModule LoadLibrary EngMultiByteToWideChar MultiByteToWideChar EngQueryLocalTime GetLocalTime EngReleaseSemaphore ReleaseSemaphore EngWideCharToMultiByte WideCharToMultiByte Für Funktionen, die einen Zeichnungsdienst erstellen oder ändern, müssen neue Treiber weiterhin GDI-Supportdienste und nicht ihre Win32-Entsprechungen aufrufen.
Anstatt Grafik-DDI-Funktionen für GDI-Gleitkommadienste zu verwenden, können Sie den FLOAT-Datentyp verwenden.