Plug-In 만들기
모든 프린터 드라이버 플러그 인은 DllMain, DllGetClassObject 및 DllCanUnloadNow 함수를 정의해야 합니다. 또한 IClassFactory COM 인터페이스와 IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS 또는 IPrintOemPS2 COM 인터페이스 중 하나를 구현해야 합니다.
사용자 인터페이스 플러그 인 또는 렌더링 플러그 인을 만들 때는 WDK에 제공된 샘플 UI 플러그 인 또는 샘플 렌더링 플러그 인에 코드를 기반으로 해야 합니다.
두 가지 유형의 플러그 인을 만들려면 다음을 수행해야 합니다.
DllMain 함수를 정의합니다(Windows SDK 설명서에 설명되어 있습니다).
모든 Win32 DLL의 진입점입니다.
DllGetClassObject 함수를 정의하고 내보냅니다(Windows SDK 설명서에 설명되어 있습니다).
프린터 드라이버는 이 함수를 호출하여 플러그 인의 IClassFactory 인터페이스 구현에 대한 액세스 권한을 얻습니다(Windows SDK 설명서에 설명되어 있습니다). 드라이버가 DllGetClassObject를 호출할 때 다음 클래스 식별자 중 하나를 지정합니다(prcomoem.h에 정의됨).
CLSID_OEMUI - UI 플러그 인용
CLSID_OEMRENDER - 플러그 인 렌더링
또한 드라이버는 IID_IClassFactory 인터페이스 식별자를 지정합니다.
DllGetClassObject 함수는 샘플 코드에 설명된 대로 해당 IClassFactory 인터페이스의 인스턴스를 만들고 포인터를 반환해야 합니다.
IClassFactory COM 인터페이스를 구현합니다.
IClassFactory 인터페이스의 CreateInstance 메서드는 다음 COM 인터페이스 중 하나의 플러그 인 구현 인스턴스를 만들어야 합니다.
IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS 또는 IPrintOemPS2
CreateInstance 메서드의 입력 중 하나는 인터페이스 식별자입니다. 드라이버는 IID_IUnknown 인터페이스 식별자를 사용하여 CreateInstance를 호출합니다. 즉, CreateInstance 메서드는 샘플 코드에 설명된 대로 생성된 인스턴스의 IUnknown 인터페이스(Windows SDK 설명서에 설명되어 있음)에 대한 포인터를 반환해야 합니다.
샘플 코드에 설명된 대로 표준 IUnknown 인터페이스를 포함하여 IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS2 COM 인터페이스 중 하나를 구현합니다.
드라이버에서 호출할 구현된 메서드 중 첫 번째는 IUnknown 인터페이스의 QueryInterface 메서드입니다(Windows SDK 설명서에 설명되어 있습니다). 이 메서드는 입력 인수로 프린터 드라이버에 대 한 인터페이스 식별자 중 하나를 수신 합니다. 드라이버는 메서드를 호출하여 플러그 인에서 지원되는 인터페이스 버전을 확인하고 지원되는 인터페이스에 대한 포인터를 받습니다.
DllCanUnloadNow 함수를 정의하고 내보냅니다(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 설명서에 설명되어 있습니다.