Creazione del plug-in
Importante
La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.
Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.
Tutti i plug-in driver della stampante devono definire funzioni DllMain, DllGetClassObject e DllCanUnloadNow. Devono inoltre implementare l'interfaccia COM IClassFactory e una delle interfacce COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2 .
Quando si crea un plug-in dell'interfaccia utente o un plug-in per il rendering, è necessario basare il codice sul plug-in dell'interfaccia utente di esempio o sui plug-in di rendering di esempio forniti in WDK.
Per creare uno dei due tipi di plug-in, è necessario eseguire le operazioni seguenti:
Definire una funzione DllMain (descritta nella documentazione di Windows SDK).
Questo è il punto di ingresso per tutte le DLL Win32.
Definire ed esportare una funzione DllGetClassObject (descritta nella documentazione di Windows SDK).
Il driver della stampante chiama questa funzione per ottenere l'accesso all'implementazione del plug-in dell'interfaccia IClassFactory (descritta nella documentazione di Windows SDK). Quando il driver chiama DllGetClassObject, specifica uno degli identificatori di classe seguenti (definiti in prcomoem.h):
CLSID_OEMUI : per i plug-in dell'interfaccia utente
CLSID_OEMRENDER : per i plug-in per il rendering
Il driver specifica anche un identificatore di interfaccia di IID_IClassFactory.
La funzione DllGetClassObject deve creare un'istanza dell'interfaccia IClassFactory e restituirvi un puntatore, come illustrato nel codice di esempio.
Implementare l'interfaccia COM IClassFactory.
Il metodo CreateInstance dell'interfaccia IClassFactory deve creare un'istanza dell'implementazione del plug-in di una delle interfacce COM seguenti:
IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2
Uno degli input del metodo CreateInstance è un identificatore di interfaccia. Il driver chiama CreateInstance con un identificatore di interfaccia di IID_IUnknown, ovvero il metodo CreateInstance deve restituire un puntatore all'interfaccia IUnknown dell'istanza creata (descritta nella documentazione di Windows SDK), come illustrato nel codice di esempio.
Implementare una delle interfacce COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2, inclusa l'interfaccia IUnknown standard, come illustrato nel codice di esempio.
Il primo dei metodi implementati da chiamare dal driver è il metodo QueryInterface dell'interfaccia IUnknown (descritto nella documentazione di Windows SDK). Questo metodo riceve uno degli identificatori di interfaccia per i driver della stampante come argomento di input. Il driver chiama il metodo per determinare quale versione dell'interfaccia è supportata dal plug-in e per ricevere un puntatore all'interfaccia supportata.
Definire ed esportare una funzione DllCanUnloadNow (descritta nella documentazione di Windows SDK).
La funzione DllCanUnloadNow deve restituire S_OK se sono state rilasciate tutte le istanze delle interfacce COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2. Il S_OK restituito indica al driver che il plug-in può essere scaricato.
Si noti che quando il driver della stampante scarica la DLL del plug-in, chiama innanzitutto la funzione DllCanUnloadNow del plug-in. Indipendentemente dal valore restituito da DllCanUnloadNow, il driver della stampante scarica quindi la DLL del plug-in chiamando la funzione FreeLibrary. Questa operazione viene eseguita per assicurarsi che la DLL del plug-in venga scaricata prima che il driver venga scaricato.
Se la DLL del plug-in deve rimanere caricata (ad esempio, quando crea un thread che usa la DLL plug-in), il thread deve caricare la DLL, usando una chiamata alla funzione LoadLibrary. Al termine del thread con la DLL, deve chiamare la funzione FreeLibraryAndExitThread per scaricarlo. In una situazione in cui un thread ha chiamato LoadLibrary, la chiamata del driver a FreeLibrary semplicemente decrementa il conteggio dei riferimenti della DLL, impedendo così il caricamento. Le funzioni LoadLibrary, FreeLibrary e FreeLibraryAndExitThread sono descritte nella documentazione di Windows SDK.