Partager via


Création du Plug-In

Important

Nous vous recommandons d’utiliser le pilote de classe de boîte de réception IPP de Microsoft, ainsi que les applications de support d’impression (PSA), pour personnaliser l’expérience d’impression dans Windows 10 et 11 pour le développement de périphériques d’imprimante.

Pour plus d’informations, consultez le Guide de conception de l’application de support d’impression.

Tous les plug-ins de pilote d’imprimante doivent définir les fonctions DllMain, DllGetClassObject et DllCanUnloadNow. Ils doivent également implémenter l’interface COM IClassFactory et l’une des interfaces COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS ou IPrintOemPS2.

Lorsque vous créez un plug-in d’interface utilisateur ou un plug-in de rendu, vous devez baser votre code sur l’exemple de plug-in d’interface utilisateur ou sur les exemples de plug-ins de rendu fournis dans le WDK.

Pour créer l’un ou l’autre type de plug-in, vous devez effectuer les opérations suivantes :

  1. Définissez une fonction DllMain (décrite dans la documentation du Kit de développement logiciel (SDK) Windows).

    Il s’agit du point d’entrée pour toutes les DLL Win32.

  2. Définissez et exportez une fonction DllGetClassObject (décrite dans la documentation du Kit de développement logiciel (SDK) Windows).

    Le pilote d’imprimante appelle cette fonction pour obtenir l’accès à l’implémentation du plug-in de l’interface IClassFactory (décrite dans la documentation du SDK Windows). Lorsque le pilote appelle DllGetClassObject, il spécifie l’un des identificateurs de classe suivants (définis dans prcomoem.h) :

    CLSID_OEMUI : pour les plug-ins d’interface utilisateur

    CLSID_OEMRENDER - pour le rendu des plug-ins

    Le pilote spécifie également un identificateur d’interface de IID_IClassFactory.

    La fonction DllGetClassObject doit créer une instance de son interface IClassFactory et y retourner un pointeur, comme illustré dans l’exemple de code.

  3. Implémentez l’interface COM IClassFactory.

    La méthode CreateInstance de l’interface IClassFactory doit créer une instance de l’implémentation du plug-in de l’une des interfaces COM suivantes :

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

    L’une des entrées de la méthode CreateInstance est un identificateur d’interface. Le pilote appelle CreateInstance avec un identificateur d’interface de IID_IUnknown, ce qui signifie que la méthode CreateInstance doit retourner un pointeur vers l’interface IUnknown de l’instance créée (décrite dans la documentation du Kit de développement logiciel (SDK) Windows), comme illustré dans l’exemple de code.

  4. Implémentez l’une des interfaces COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS ou IPrintOemPS2, y compris l’interface IUnknown standard, comme illustré dans l’exemple de code.

    La première des méthodes implémentées à appeler par le pilote est la méthode QueryInterface de l’interface IUnknown (décrite dans la documentation du Kit de développement logiciel (SDK) Windows. Cette méthode reçoit l’un des identificateurs d’interface des pilotes d’imprimante en tant qu’argument d’entrée. Le pilote appelle la méthode pour déterminer quelle version de l’interface est prise en charge par le plug-in et pour recevoir un pointeur vers l’interface prise en charge.

  5. Définissez et exportez une fonction DllCanUnloadNow (décrite dans la documentation du SDK Windows).

    La fonction DllCanUnloadNow doit retourner S_OK si toutes les instances des interfaces COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS ou IPrintOemPS2 com implémentées par le plug-in ont été publiées. Le retour S_OK indique au pilote que le plug-in peut être déchargé.

    Notez que lorsque le pilote d’imprimante décharge la DLL du plug-in, il appelle d’abord la fonction DllCanUnloadNow du plug-in. Quelle que soit la valeur retournée par DllCanUnloadNow, le pilote d’imprimante décharge ensuite la DLL du plug-in en appelant la fonction FreeLibrary. Cette opération permet de s’assurer que la DLL du plug-in est déchargée avant le déchargement du pilote.

    Si la DLL de plug-in doit rester chargée (par exemple, lorsqu’elle crée un thread qui utilise la DLL de plug-in), le thread doit charger la DLL, à l’aide d’un appel à la fonction LoadLibrary. Lorsque le thread a terminé avec la DLL, il doit appeler la fonction FreeLibraryAndExitThread pour le décharger. Dans une situation où un thread a appelé LoadLibrary, l’appel du pilote à FreeLibrary décrémente simplement le nombre de références de la DLL, empêchant ainsi son déchargement. Les fonctions LoadLibrary, FreeLibrary et FreeLibraryAndExitThread sont décrites dans la documentation du Kit de développement logiciel (SDK) Windows.