Création du plug-in
Important
La plateforme d’impression moderne est le moyen privilégié de Windows pour communiquer avec les imprimantes. Nous vous recommandons d’utiliser le pilote de classe IPP en boîte 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’impression.
Pour plus d’informations, veuillez consulter les articles Plateforme d’impression moderne et Guide de conception des applications de support d’impression.
Tous les plug-ins de pilotes 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’UI ou 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 :
Définir une fonction DllMain (décrite dans la documentation du SDK Windows).
Il s’agit du point d’entrée pour toutes les DLL Win32.
Définir et exporter une fonction DllGetClassObject (décrite dans la documentation du 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’UI
CLSID_OEMRENDER - pour les plug-ins de rendu
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 retourner un pointeur vers celui-ci, comme illustré dans l’exemple de code.
Implémenter 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 SDK Windows), comme illustré dans l’exemple de code.
Implémenter l’une des interfaces COM IPrintOemUI, IPrintOemUI2, 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 SDK Windows). Cette méthode reçoit l’un des identificateurs d’interface pour les pilotes d’imprimante en tant qu’argument d’entrée. Le pilote appelle la méthode pour déterminer la version de l’interface prise en charge par le plug-in et recevoir un pointeur vers l’interface prise en charge.
Définir et exporter 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 implémentées par le plug-in IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemUni3, IPrintOemPS ou IPrintOemPS2 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 de plug-in en appelant la fonction FreeLibrary. Cela permet de s’assurer que la DLL de plug-in est déchargée avant que le pilote ne soit déchargé.
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 est terminé avec la DLL, il doit appeler la fonction FreeLibraryAndExitThread pour la décharger. Si un thread a appelé LoadLibrary, l’appel du pilote à FreeLibrary décrémente simplement le nombre de références de la DLL, ce qui l’empêche d’être déchargée. Les fonctions LoadLibrary, FreeLibrary et FreeLibraryAndExitThread sont décrites dans la documentation du SDK Windows.