Freigeben über


Erstellen des Plug-Ins

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.

Alle Druckertreiber-Plug-Ins müssen dllMain-, DllGetClassObject- und DllCanUnloadNow-Funktionen definieren. Sie müssen auch die IClassFactory COM-Schnittstelle und eine der IPrintOemUI-, IPrintOemUI2-, IPrintOemUni-, IPrintOemUni2-, IPrintOemUni3-, IPrintOemPS- oder IPrintOemPS2-COM-Schnittstellen implementieren.

Wenn Sie entweder ein Benutzeroberflächen-Plug-In oder ein Rendering-Plug-In erstellen, sollten Sie den Code auf dem Beispiel-UI-Plug-In oder den Beispielrendering-Plug-Ins basieren, die im WDK bereitgestellt werden.

Zum Erstellen eines Plug-In-Typs müssen Sie die folgenden Schritte ausführen:

  1. Definieren Sie eine DllMain-Funktion (in der Windows SDK-Dokumentation beschrieben).

    Dies ist der Einstiegspunkt für alle Win32-DLLs.

  2. Definieren und Exportieren einer DllGetClassObject-Funktion (in der Windows SDK-Dokumentation beschrieben).

    Der Druckertreiber ruft diese Funktion auf, um Zugriff auf die Implementierung der IClassFactory-Schnittstelle des Plug-Ins zu erhalten (in der Windows SDK-Dokumentation beschrieben). Wenn der Treiber DllGetClassObject aufruft, gibt er einen der folgenden Klassenbezeichner an (definiert in prcomoem.h):

    CLSID_OEMUI – für UI-Plug-Ins

    CLSID_OEMRENDER – zum Rendern von Plug-Ins

    Der Treiber gibt auch einen Schnittstellenbezeichner von IID_IClassFactory an.

    Die DllGetClassObject-Funktion muss eine Instanz der IClassFactory-Schnittstelle erstellen und einen Zeiger darauf zurückgeben, wie im Beispielcode dargestellt.

  3. Implementieren Sie die IClassFactory COM-Schnittstelle.

    Die CreateInstance-Methode der IClassFactory-Schnittstelle sollte eine Instanz der Implementierung des Plug-Ins einer der folgenden COM-Schnittstellen erstellen:

    IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS oder IPrintOemPS2

    Eine der Eingaben der CreateInstance-Methode ist ein Schnittstellenbezeichner. Der Treiber ruft CreateInstance mit einem Schnittstellenbezeichner von IID_IUnknown auf, d. h. die CreateInstance-Methode muss einen Zeiger auf die IUnknown-Schnittstelle der erstellten Instanz zurückgeben (wie in der Windows SDK-Dokumentation beschrieben), wie im Beispielcode veranschaulicht.

  4. Implementieren Sie eine der IPrintOemUI-, IPrintOemUI2-, IPrintOemUni2-, IPrintOemUni2-, IPrintOemUni3-, IPrintOemPS2- oder IPrintOemPS2-COM-Schnittstellen, einschließlich der standardmäßigen IUnknown-Schnittstelle, wie im Beispielcode dargestellt.

    Die erste der implementierten Methoden, die vom Treiber aufgerufen werden sollen, ist die QueryInterface-Methode der IUnknown-Schnittstelle (in der Windows SDK-Dokumentation beschrieben). Diese Methode empfängt einen der Schnittstellenbezeichner für Druckertreiber als Eingabeargument. Der Treiber ruft die Methode auf, um zu bestimmen, welche Version der Schnittstelle vom Plug-In unterstützt wird, und um einen Zeiger auf die unterstützte Schnittstelle zu empfangen.

  5. Definieren und Exportieren einer DllCanUnloadNow-Funktion (in der Windows SDK-Dokumentation beschrieben).

    Die DllCanUnloadNow-Funktion muss S_OK zurückgeben, wenn alle Instanzen der plug-in-implementierten IPrintOemUI-, IPrintOemUI2-, IPrintOemUni2-, IPrintOemUni2-, IPrintOemUni3-, IPrintOemPS- oder IPrintOemPS2-COM-Schnittstellen freigegeben wurden. Die S_OK Rückgabe gibt an, dass das Plug-In entladen werden kann.

    Beachten Sie, dass der Druckertreiber beim Entladen der Plug-In-DLL zuerst die DllCanUnloadNow-Funktion des Plug-Ins aufruft. Unabhängig vom von DllCanUnloadNow zurückgegebenen Wert entlädt der Druckertreiber dann die Plug-In-DLL durch Aufrufen der FreeLibrary-Funktion. Dadurch wird sichergestellt, dass die Plug-In-DLL entladen wird, bevor der Treiber entladen wird.

    Wenn die Plug-In-DLL geladen bleiben muss (z. B. wenn ein Thread erstellt wird, der die Plug-In-DLL verwendet), muss der Thread die DLL mithilfe eines Aufrufs der LoadLibrary-Funktion laden. Wenn der Thread mit der DLL fertig ist, sollte er die FreeLibraryAndExitThread-Funktion aufrufen, um ihn zu entladen. In einer Situation, in der ein Thread LoadLibrary aufgerufen hat, wird der Aufruf des Treibers an FreeLibrary lediglich die Verweisanzahl der DLL erhöht, wodurch verhindert wird, dass sie entladen wird. Die Funktionen LoadLibrary, FreeLibrary und FreeLibraryAndExitThread werden in der Windows SDK-Dokumentation beschrieben.