다음을 통해 공유


인쇄 필터의 비동기 알림

Important

최신 인쇄 플랫폼은 Windows에서 프린터와 통신하는 데 선호되는 수단입니다. 프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하려면 MICROSOFT의 IPP 받은 편지함 클래스 드라이버와 PSA(인쇄 지원 앱)를 사용하는 것이 좋습니다.

자세한 내용은 최신 인쇄 플랫폼 및 인쇄 지원 앱 디자인 가이드를 참조하세요.

인쇄 필터 파이프라인에는 애플리케이션의 인쇄 스풀러에서 지원되는 비동기 알림과 매우 유사한 비동기 알림 기능이 있습니다. 인쇄 스풀러에서 사용할 수 있는 RouterCreatePrintAsyncNotificationChannel 함수는 인쇄 필터에 사용할 수 없습니다. 인쇄 필터는 IPrintClassObjectFactory 인터페이스를 사용하여 IPrintAsyncNotify 개체를 만들어야 합니다.

이 항목에서는 인쇄 필터에서 비동기 알림 기능을 사용하는 방법을 설명합니다.

v4 인쇄 드라이버 모델에서는 인쇄 필터에서 비동기 알림을 throw할 수 없습니다.

IPrintClassObjectFactory

IPrintClassObjectFactory 인터페이스는 알림 인터페이스에 대한 액세스를 제공합니다. 다음 코드 예제에서는 필터 속성 모음에서이 인터페이스를 가져올 수 있는 방법을 보여 줍니다.

// This interface is defined as a private member variable in the filter class
IPrintClassObjectFactory  *m_pPrintClassFactory;

// The following code goes in the IntializeFilter method of the filter
VARIANT var;
VariantInit(&var);

HRESULT hr = pIPropertyBag->GetProperty(
    XPS_FP_PRINT_CLASS_FACTORY,
    &var);

if (SUCCEEDED(hr))
{
    hr = V_UNKNOWN(&var)->QueryInterface(
 IID_IPrintClassObjectFactory,
 reinterpret_cast<void **>(&m_pPrintClassFactory));
}

알림 채널

IPrintClassObjectFactory 인터페이스를 사용하면 필터의 요구 사항에 따라 단방향 또는 양방향 알림 채널을 만들 수 있습니다. 다음 코드 예제는 앞의 예제에서 계속되며 필터가 단방향 알림 채널을 설정하는 방법을 보여 줍니다.

// Create a unidirectional notification channel
IPrintAsyncNotifyChannel  *pIAsyncNotifyChannel;
IPrintAsyncNotify  *pIAsyncNotify;

HRESULT hr = m_pPrintClassFactory->GetPrintClassObject(
 m_bstrPrinter,      // The printer name that was read from the property bag
 IID_IPrintAsyncNotify,
 reinterpret_cast<void**>(&pIAsyncNotify)));

if (SUCCEEDED(hr))
{
    hr = pIAsyncNotify->CreatePrintAsyncNotifyChannel(
 m_jobId,
 const_cast<GUID*>(&MS_ASYNCNOTIFY_UI),
 kPerUser,
 kUniDirectional,
        NULL,
        &pIAsyncNotifyChannel));

   // etc...
}

양방향 알림 채널을 만들려면 앞의 예제 대신 다음 코드 예제를 사용합니다.

// Create a bidirectional notification channel
IPrintAsyncNotifyChannel *pIAsyncNotifyChannel;
IPrintAsyncNotify *pIAsyncNotify;

HRESULT hr = m_pPrintClassFactory->GetPrintClassObject(
 m_bstrPrinterName,   // The printer name that was read from the property bag
 IID_IPrintAsyncNotify,
 reinterpret_cast<void**>(&pIAsyncNotify)));

if (SUCCEEDED(hr))
{
    hr = pIAsyncNotify->CreatePrintAsyncNotifyChannel(
 m_jobId,
 const_cast<GUID*>(& SAMPLE_ASYNCNOTIFY_UI),
 kPerUser,
 kBiDirectional,
 pIAsyncCallback,
        &pIAsyncNotifyChannel));

    // etc...
}

앞의 코드 예제에서 변수 pIAsyncCallback 는 호출자의 IPrintAsyncNotifyCallback 인터페이스 구현에 대한 포인터입니다.

경우에 따라 작업이 완료되면 양방향 알림 채널을 해제해야 합니다. 이렇게 하려면 IPrintAsyncNotifyChannel에서 Release 메서드를 호출합니다. 채널을 해제하는 시기에 대한 자세한 내용은 알림 채널을 참조 하세요.

가장 및 알림

필터는 IPrintAsyncNotify::CreatePrintAsyncNotifyChannel 메서드를 호출할 때 사용자 계정을 가장해서는 안 됩니다. 인쇄 스풀러의 권한 부여 메커니즘을 사용하려면 로컬 서비스 계정에서 호출해야 합니다. 필터가 작업을 제출한 사용자의 계정을 가장해야 하는 경우 CreatePrintAsyncNotifyChannel을 호출하기 전에 필터를 자체로 되돌려야 합니다. 호출이 반환된 후 필요한 경우 필터를 사용자 계정으로 되돌릴 수 있습니다.

로컬 서비스 컨텍스트에서 알림 호출이 수행되더라도 kPerUser 알림은 작업 ID의 사용자 연결을 기반으로 작업을 제출한 사용자에게 계속 전송됩니다.

WDK 샘플 코드 조정

RouterCreatePrintAsyncNotificationChannel 호출을 다음 코드 예제로 바꿔서 WDK 샘플 코드의 알림 샘플을 인쇄 필터에서 작동하도록 조정할 수 있습니다.

IPrintAsyncNotify  *pIAsyncNotify;

HRESULT hr = m_pPrintClassFactory->GetPrintClassObject(
 m_bstrPrinterName,      // get it from the property bag
 IID_IPrintAsyncNotify,
 reinterpret_cast<void**>(&pIAsyncNotify)));

if (SUCCEEDED(hr))
{
    hr = pIAsyncNotify->CreatePrintAsyncNotifyChannel(
 // the same arguments as for
 // RouterCreatePrintAsyncNotificationChannel
        );

    // etc...
}