Freigeben über


Erstellen des Plug-In

Wichtig

Es wird empfohlen, den IPP-Posteingangsklassentreiber von Microsoft zusammen mit Druckunterstützungs-Apps (PSA) zu verwenden, um die Druckoberfläche in Windows 10 und 11 für die Druckergeräteentwicklung anzupassen.

Weitere Informationen finden Sie im Designhandbuch für Druckunterstützungs-Apps.

Alle Druckertreiber-Plug-Ins müssen die Funktionen DllMain, DllGetClassObject und DllCanUnloadNow definieren. Außerdem müssen sie die IClassFactory COM-Schnittstelle und eine der COM-Schnittstellen IPrintOemUI, IPrintOemUI2, IPrintOemUni2, IPrintOemUni2, IPrintOemUni3, IPrintOemPS oder IPrintOemPS2 implementieren.

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

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 Sie eine 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 Dokumentation zum Windows SDK beschrieben). Wenn der Treiber DllGetClassObject aufruft, gibt er einen der folgenden Klassenbezeichner an (definiert in prcomoem.h):

    CLSID_OEMUI – für Benutzeroberflächen-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 veranschaulicht.

  3. Implementieren Sie die IClassFactory-COM-Schnittstelle.

    Die CreateInstance-Methode der IClassFactory-Schnittstelle sollte eine Instanz der Implementierung einer der folgenden COM-Schnittstellen durch das Plug-In erstellen:

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

    Einer der Eingaben der CreateInstance-Methode ist ein Schnittstellenbezeichner. Der Treiber ruft CreateInstance mit dem Schnittstellenbezeichner IID_IUnknown auf, was bedeutet, dass die CreateInstance-Methode einen Zeiger auf die IUnknown-Schnittstelle der erstellten Instanz zurückgeben muss (beschrieben in der Dokumentation zum Windows SDK), wie im Beispielcode veranschaulicht.

  4. Implementieren Sie eine der COM-Schnittstellen IPrintOemUI, IPrintOemUI2, IPrintOemUni2, IPrintOemUni2, IPrintOemUni3, IPrintOemPS oder IPrintOemPS2, einschließlich der IUnknown-Standardschnittstelle, wie im Beispielcode veranschaulicht.

    Die erste der implementierten Methoden, die vom Treiber aufgerufen werden sollen, ist die QueryInterface-Methode der IUnknown-Schnittstelle (in der Dokumentation zum Windows SDK 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 erhalten.

  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 com-Schnittstellen IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS oder IPrintOemPS2 freigegeben wurden. Die S_OK rückgabe gibt dem Treiber an, dass das Plug-In entladen werden kann.

    Beachten Sie, dass beim Entladen der Plug-In-DLL zuerst die DllCanUnloadNow-Funktion des Plug-Ins aufgerufen wird. Unabhängig vom Wert, der von DllCanUnloadNow zurückgegeben wird, entlädt der Druckertreiber dann die Plug-In-DLL, indem er die FreeLibrary-Funktion aufruft. 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 sie einen Thread erstellt, der die Plug-In-DLL verwendet), muss der Thread die DLL mithilfe eines Aufrufs der LoadLibrary-Funktion laden. Wenn der Thread mit der DLL abgeschlossen ist, sollte die FreeLibraryAndExitThread-Funktion aufgerufen werden, um ihn zu entladen. In einer Situation, in der ein Thread LoadLibrary aufgerufen hat, verringert der Aufruf des Treibers von FreeLibrary lediglich die Verweisanzahl der DLL, wodurch verhindert wird, dass sie entladen wird. Die Funktionen LoadLibrary, FreeLibrary und FreeLibraryAndExitThread werden in der Dokumentation zum Windows SDK beschrieben.