Freigeben über


Nicht-COM-basierte Rendering-Plug-Ins

Wichtig

Die Modern Print-Plattform ist die von Windows bevorzugte Methode zur 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 im Designhandbuch zur Print Support App v1 und v2.

Ein Drucker-Minidriver benachrichtigt den Core-Treiber über seine Funktionalitäten, indem er die Funktion OEMEnableDriver implementiert, die die Mitglieder einer DRVENABLEDATA-Struktur ausfüllt. Das pdrvfn-Mitglied dieser Struktur sollte mit der Array-Adresse von DRVFN-Strukturen festgelegt werden. Jedes Element dieses Arrays sollte mit einem Funktionsindex und der Adresse einer der OEMXxx-Funktionen, die die IHV implementiert, initialisiert werden. (Detaillierte Beschreibungen der einzelnen OEMXxx-Funktionen finden Sie unter Nicht-COM-basierte DDI Hook-Out Funktionen).

Wenn eine Anwendung Microsoft Win32 GDI aufruft, um eine Rendering-Aufgabe auszuführen, ruft Win32 GDI wiederum den Unidrv- oder Pscript5-Core-Treiber auf, der diese Aufgabe normalerweise übernimmt. Wenn jedoch ein Drucker-Minidriver angegeben hat, dass er in der Lage ist, einen bestimmten Rendering-Vorgang auszuführen, übergibt der Core-Treiber die Rendering-Aufgabe an das IHV-Rendering-Plugin.

Nehmen wir zum Beispiel eine Anwendung, die die Win32 LineTo API aufruft (beschrieben in der Windows SDK-Dokumentation). Allgemein würde dies zu einem weiteren Aufruf der DrvLineTo-DDI des Core-Treibers führen, um die Zeile darzustellen. Wenn der Drucker-Minidriver jedoch angegeben hat, dass er den Aufruf dieses DDIs als Hookout verwenden will, leitet DrvLineTo den Aufruf sofort an die Funktion OEMLineTo des IHV weiter.

Ein IHV kann OEMLineTo oder eine der anderen Hook-Out-Funktionen implementieren, die in Nicht-COM-basierte DDI-Hook-Out-Funktionen beschrieben sind, so dass es den Rendering-Vorgang vollständig abwickeln kann, oder es kann einen Callback durchführen, damit der Core-Treiber diesen Vorgang abwickelt.

OEMLineTo könnte wie in dem folgenden Pseudocode-Beispiel implementiert werden:

BOOL APIENTRY
  OEMLineTo(
    SURFOBJ  *pso,
    CLIPOBJ  *pco,
    BRUSHOBJ  *pbo,
    LONG  x1,
    LONG  y1,
    LONG  x2,
    LONG  y2,
    RECTL  *prclBounds,
    MIX  mix
)
{
if ( OEM intends to handle the call ) {
 code to handle the call
}
else
// OEM calls Unidrv's DrvLineTo DDI
  bRetVal = (((PFN_DrvLineTo)(poempdev->pfnUnidrv[UD_DrvLineTo])) (
 pso,
            pco,
            pbo,
            x1,
            x2,
 y1,
            y2,
            prclBounds,
            mix,));
}

Im vorangegangenen Beispiel wird der Ausdruck

poempdev->pfnUnidrv[UD_DrvLineTo]

die Adresse der DDI DrvLineTo des Core-Treibers aus. Der vorangestellte Ausdruck (PFN_DrvLineTo) wandelt den Funktionszeiger in den entsprechenden Typ um. Jede der in diesem Abschnitt aufgeführten Hook-Out-Funktionen ist mit einem eigenen Funktionszeiger verbunden.

Beachten Sie, dass Unidrv den Aufruf einfach ignorieren kann, indem es FALSE zurückgibt, wenn ein OEMXxx-DDI zum Unidrv Core-Treiber zurückruft und die betreffende Oberfläche eine geräteverwaltete Oberfläche ist.