Tworzenie Plug-In
Ważny
Nowoczesna platforma drukowania jest preferowanym sposobem komunikacji z drukarkami w systemie Windows. Zalecamy używanie sterownika klasy skrzynki odbiorczej IPP firmy Microsoft wraz z aplikacjami do obsługi drukowania (PSA), aby dostosować środowisko drukowania w systemie Windows 10 i 11 na potrzeby opracowywania urządzeń drukarki.
Aby uzyskać więcej informacji, zobacz przewodnik projektowania aplikacji wspierających druk .
Wszystkie wtyczki sterownika drukarki muszą definiować funkcje DllMain, DllGetClassObject i DllCanUnloadNow. Muszą również zaimplementować interfejs IClassFactory COM i jeden z interfejsów IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPSlub IPrintOemPS2 COM.
Podczas tworzenia wtyczki interfejsu użytkownika lub wtyczki renderowania , należy oprzeć kod na przykładowej wtyczce interfejsu użytkownika lub przykładowych wtyczkach renderowania podanych w zestawie WDK.
Aby utworzyć dowolny typ wtyczki, należy wykonać następujące czynności:
Zdefiniuj funkcję DllMain (opisaną w dokumentacji zestawu Windows SDK).
Jest to punkt wejścia dla wszystkich bibliotek DLL Win32.
Zdefiniuj i wyeksportuj funkcję DllGetClassObject (opisaną w dokumentacji zestawu Windows SDK).
Sterownik drukarki wywołuje tę funkcję, aby uzyskać dostęp do implementacji wtyczki interfejsu IClassFactory (opisanego w dokumentacji zestawu Windows SDK). Gdy sterownik wywołuje funkcję DllGetClassObject, określa jeden z następujących identyfikatorów klas (zdefiniowanych w pliku prcomoem.h):
CLSID_OEMUI — w przypadku wtyczek interfejsu użytkownika
CLSID_OEMRENDER — do renderowania wtyczek
Sterownik określa również identyfikator interfejsu IID_IClassFactory.
Funkcja DllGetClassObject musi utworzyć wystąpienie interfejsu IClassFactory i zwrócić do niego wskaźnik, jak pokazano w przykładowym kodzie.
Zaimplementuj interfejs IClassFactory COM.
Metoda CreateInstance interfejsu IClassFactory powinna utworzyć wystąpienie implementacji wtyczki dla jednego z następujących interfejsów COM:
IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPSlub IPrintOemPS2
Jednym z danych wejściowych metody CreateInstance jest identyfikator interfejsu. Sterownik wywołuje metodę CreateInstance z identyfikatorem interfejsu IID_IUnknown, co oznacza, że metoda CreateInstance musi zwrócić wskaźnik do interfejsu IUnknown utworzonego wystąpienia (opisanego w dokumentacji Windows SDK), jak to ilustruje przykładowy kod.
Zaimplementuj jeden z interfejsów IPrintOemUI, IPrintOemUI2, IPrintOemUni2, IPrintOemUni3, IPrintOemPS lub IPrintOemPS2 COM, w tym standardowy interfejs IUnknown, jak pokazano w przykładowym kodzie.
Pierwszą z zaimplementowanych metod wywoływanych przez sterownik jest metoda QueryInterface interfejsu IUnknown (opisana w dokumentacji zestawu Windows SDK). Ta metoda odbiera jeden z identyfikatorów interfejsu dla sterowników drukarek jako argument wejściowy. Sterownik wywołuje metodę , aby określić, która wersja interfejsu jest obsługiwana przez wtyczkę i odbiera wskaźnik do obsługiwanego interfejsu.
Zdefiniuj i wyeksportuj funkcję DllCanUnloadNow (opisaną w dokumentacji zestawu Windows SDK).
Funkcja DllCanUnloadNow musi zwrócić S_OK, jeśli wszystkie wystąpienia interfejsów COM zaimplementowanych przez wtyczkę IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS lub IPrintOemPS2 zostały zwolnione. Zwrot S_OK wskazuje sterownikowi, że wtyczka może zostać odłączona.
Należy pamiętać, że gdy sterownik drukarki zwalnia wtyczkę DLL, najpierw wywołuje funkcję DllCanUnloadNow wtyczki. Niezależnie od wartości zwracanej przez funkcję DllCanUnloadNow, sterownik drukarki następnie zwalnia bibliotekę DLL wtyczki, wywołując funkcję FreeLibrary. Należy to zrobić, aby upewnić się, że wtyczka DLL zostanie zwolniona przed zwolnieniem sterownika.
Jeśli wtyczka DLL musi pozostać załadowana (na przykład podczas tworzenia wątku korzystającego z biblioteki DLL wtyczki), wątek musi załadować bibliotekę DLL przy użyciu wywołania funkcji LoadLibrary. Po zakończeniu pracy wątku z biblioteką DLL, należy wywołać funkcję FreeLibraryAndExitThread, aby ją wyładować. W sytuacji, gdy wątek wywołał LoadLibrary, wywołanie przez sterownik funkcji FreeLibrary jedynie zmniejsza licznik odwołań do biblioteki DLL, co zapobiega jej rozładowaniu. Funkcje LoadLibrary, FreeLibrary i FreeLibraryAndExitThread zostały opisane w dokumentacji zestawu Windows SDK.