次の方法で共有


プラグインを作成する

重要

プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。

詳細については、プリントサポートアプリデザインガイド.

すべてのプリンター ドライバー プラグインは、DllMain、DllGetClassObject、および DllCanUnloadNow 関数を定義する必要があります。 また、IClassFactory COM インターフェイスと、IPrintOemUIIPrintOemUI2IPrintOemUniIPrintOemUni2IPrintOemUni3IPrintOemPS、または IIPrintOemPS2 COM インターフェイスのいずれかを実装する必要があります。

ユーザー インターフェイス プラグインまたはレンダリング プラグインを作成する場合は、サンプル UI プラグインまたは WDK で提供されるサンプル レンダリング プラグインに基づいてコードを作成する必要があります。

いずれかの種類のプラグインを作成するには、次の操作を行う必要があります:

  1. DllMain 関数を定義します (Windows SDK ドキュメントで説明)。

    これは、すべての Win32 DLL のエントリ ポイントです。

  2. DllGetClassObject 関数を定義してエクスポートします (Windows SDK ドキュメントで説明されています)。

    プリンター ドライバーは、この関数を呼び出して、プラグインの IClassFactory インターフェイスの実装 (Windows SDK ドキュメントで説明) へのアクセスを取得します。 ドライバーが DllGetClassObject を呼び出すときは、次のいずれかのクラス識別子 (prcomoem.h で定義) を指定します。

    CLSID_OEMUI - UI プラグイン用

    CLSID_OEMRENDER - プラグインのレンダリング用

    ドライバーは、IID_IClassFactoryのインターフェイス識別子も指定します。

    DllGetClassObject 関数は、サンプル コードに示すように、IClassFactory インターフェイスのインスタンスを作成し、ポインターを返す必要があります。

  3. IClassFactory COM インターフェイスを実装します。

    IClassFactory インターフェイスの CreateInstance メソッドは、次のいずれかの COM インターフェイスのプラグインの実装インスタンスを作成する必要があります。

    IPrintOemUIIPrintOemUI2IPrintOemUniIPrintOemUni2IPrintOemUni3IPrintOemPS、または IPrintOemPS2

    CreateInstance メソッドの入力項目の 1 つはインターフェイス識別子です。 ドライバーは、IID_IUnknownのインターフェイス識別子を使用して CreateInstance を呼び出します。つまり、CreateInstance メソッドは、作成されたインスタンスの IUnknown インターフェイスへのポインターを返す必要があります (Windows SDK ドキュメントで説明)。

  4. サンプル コードに示すように、IPrintOemUI、IPrintOemUI2、IPrintOemUni、IPrintOemUni2、IPrintOemUni3、IPrintOemPS、または IPrintOemPS2 COM インターフェイスのいずれかを実装します (標準の IUnknown インターフェイスを含む)。

    ドライバーによって呼び出される実装メソッドの最初のメソッドは、IUnknown インターフェイスの QueryInterface メソッドです (Windows SDK のドキュメントで説明)。 このメソッドは、入力引数としてプリンター ドライバーのインターフェイス識別子のいずれかを受け取ります。 ドライバーは、プラグインでサポートされているインターフェイスのバージョンを決定し、サポートされているインターフェイスへのポインターを受け取るメソッドを呼び出します。

  5. DllGetClassObject 関数を定義し、エクスポートします (Windows SDK ドキュメントで説明されています)。

    プラグインで実装された IPrintOemUI、IPrintOemUI2、IPrintOemUni、IPrintOemUni2、IPrintOemUni3、IPrintOemPS、または IPrintOemPS2 COM インターフェイスのすべてのインスタンスがリリースされている場合、DllCanUnloadNow 関数は、S_OKを返す必要があります。 S_OK戻り値は、プラグインをアンロードできることをドライバーに示します。

    プリンター ドライバーは、プラグイン DLL をアンロードするときに、最初にプラグインの DllCanUnloadNow 関数を呼び出すことに留意してください。 DllCanUnloadNow によって返される値に関係なく、プリンター ドライバーは FreeLibrary 関数を呼び出してプラグイン DLL をアンロードします。 これは、ドライバーがアンロードされる前にプラグイン DLL がアンロードされるようにするために行われます。

    プラグイン DLL を再読み込みする必要がある場合メイン (たとえば、プラグイン DLL を使用するスレッドを作成する場合)、スレッドは LoadLibrary 関数の呼び出しを使用して DLL を読み込む必要があります。 スレッドが DLL で終了したら、FreeLibraryAndExitThread 関数を呼び出してアンロードする必要があります。 スレッドが LoadLibrary を呼び出した場合、FreeLibrary に対するドライバーの呼び出しは、DLL の参照カウントをデクリメントするだけで済むため、アンロードされません。 LoadLibrary、FreeLibrary、FreeLibraryAndExitThread 関数については、Windows SDK のドキュメントで説明されています。