Share via


COM 콜백 등록

작업의 상태 변경 내용을 폴링하는 대신 작업의 상태 변경될 때 알림을 받도록 등록할 수 있습니다. 알림을 받으려면 IBackgroundCopyCallback2 인터페이스를 구현해야 합니다. 인터페이스에는 등록에 따라 BITS에서 호출하는 다음 메서드가 포함되어 있습니다.

IBackgroundCopyCallback2 인터페이스를 구현하는 예제는 IBackgroundCopyCallback 인터페이스 항목의 예제 코드를 참조하세요.

IBackgroundCopyCallback2 인터페이스는 파일이 전송될 때 알림을 제공합니다. 일반적으로 이 메서드를 사용하여 파일의 유효성을 검사하여 피어가 파일을 다운로드할 수 있도록 합니다. 그렇지 않으면 IBackgroundCopyJob::Complete 메서드를 호출할 때까지 피어에서 파일을 사용할 수 없습니다. 파일의 유효성을 검사하려면 IBackgroundCopyFile3::SetValidationState 메서드를 호출합니다.

COM 콜백을 등록하는 방법에는 콜백 개체 등록 또는 콜백 클래스 ID 등록의 두 가지 방법이 있습니다. 콜백 개체를 사용하면 오버헤드가 더 간단하고 낮아집니다. 콜백 CLSID를 사용하는 것이 더 안정적이지만 더 복잡합니다. 둘 다 등록하거나 둘 다 등록할 수 없습니다. BITS는 콜백 개체가 존재하고 여전히 호출할 수 있는 경우 콜백 개체를 사용하고, 실패한 경우 제공된 클래스 ID를 기반으로 새 개체를 인스턴스화하는 것으로 대체됩니다.

콜백 개체 등록

BITS에 구현을 등록하려면 IBackgroundCopyJob::SetNotifyInterface 메서드를 호출합니다. BITS가 호출하는 메서드를 지정하려면 IBackgroundCopyJob::SetNotifyFlags 메서드를 호출합니다.

애플리케이션이 종료되면 알림 인터페이스가 유효하지 않습니다. BITS는 알림 인터페이스를 유지하지 않습니다. 따라서 애플리케이션의 초기화 프로세스는 알림을 받을 기존 작업을 등록해야 합니다. 애플리케이션이 마지막으로 실행된 이후 발생한 상태 및 진행률 정보를 캡처해야 하는 경우 애플리케이션 초기화 중에 상태 및 진행률 정보를 폴링합니다.

종료하기 전에 애플리케이션은 콜백 인터페이스 포인터(SetNotifyInterface(NULL))를 지워야 합니다. BITS가 더 이상 유효하지 않음을 검색하도록 하는 것보다 콜백 포인터를 지우는 것이 더 효율적입니다.

둘 이상의 애플리케이션이 SetNotifyInterface 메서드를 호출하여 작업에 대한 알림 인터페이스를 설정하는 경우 SetNotifyInterface 메서드를 호출하는 마지막 애플리케이션은 알림을 받는 애플리케이션이며 다른 애플리케이션은 알림을 받지 않습니다.

다음 예제에서는 알림을 등록하는 방법을 보여 줍니다. 이 예제에서는 IBackgroundCopyJob 인터페이스 포인터가 유효하다고 가정합니다. 다음 예제에서 사용되는 CNotifyInterface 예제 클래스에 대한 자세한 내용은 IBackgroundCopyCallback 인터페이스를 참조하세요.

HRESULT hr;
IBackgroundCopyJob* pJob;
CNotifyInterface *pNotify = new CNotifyInterface();

if (pNotify)
{
    hr = pJob->SetNotifyInterface(pNotify);
    if (SUCCEEDED(hr))
    {
        hr = pJob->SetNotifyFlags(BG_NOTIFY_JOB_TRANSFERRED | 
                                  BG_NOTIFY_JOB_ERROR );
    }
    pNotify->Release();
    pNotify = NULL;

    if (FAILED(hr))
    {
        //Handle error - unable to register callbacks.
    }
}

콜백 CLSID 등록

BITS에 콜백 CLSID를 등록하려면 BITS_JOB_PROPERTY_NOTIFICATION_CLSID PropertyId를 사용하여 IBackgroundCopyJob5::SetProperty 메서드를 호출합니다. BITS가 호출하는 메서드를 지정하려면 IBackgroundCopyJob::SetNotifyFlags 메서드를 호출합니다 .

BITS 작업을 사용하여 CLSID를 등록하기 전에 알림 CLSID가 Out-of-process COM 서버에 등록되었는지 확인해야 합니다. COM 서버를 구현하는 것은 콜백 개체를 정의하고 전달하는 것보다 훨씬 복잡하지만 몇 가지 중요한 이점을 제공합니다. COM 서버를 사용하면 BITS가 시스템 재부팅에서 BITS 작업과 애플리케이션 코드 간의 연결을 유지하고, 대규모 또는 수명이 긴 작업에 대해 연결을 유지할 수 있습니다. 또한 COM 서버를 사용하면 BITS가 백그라운드에서 전송을 계속 실행하는 동안 애플리케이션을 완전히 종료할 수 있으므로 시스템의 배터리, CPU 및 메모리 사용량이 향상될 수 있습니다.

수신하도록 등록한 알림을 제공하기 위해 BITS는 먼저 연결했을 수 있는 기존 콜백 개체의 해당 메서드를 호출하려고 시도합니다. 기존 개체가 없거나 기존 개체의 연결이 끊어진 경우(일반적으로 애플리케이션 종료의 결과로) BITS는 알림 CLSID를 사용하여 CoCreateInstance를 호출하여 새 콜백 개체를 인스턴스화하고 연결이 끊어지거나 IBackgroundCopyJob에 대한 새 호출로 대체될 때까지 해당 개체를 추가 콜백에 사용합니다. SetNotifyInterface.

콜백 개체와 달리 콜백 CLSID는 BITS 서비스 또는 시스템이 종료되고 다시 시작되는 경우 해당 BITS 작업과 함께 유지됩니다. 애플리케이션은 GUID_NULL 새 알림 CLSID를 전달하여 종료하기 전에(또는 다른 시간에) 이전에 설정된 알림 CLSID를 지울 수 있지만 애플리케이션이 CLSID에 대한 CoCreateInstance 요청에 대한 응답으로 COM을 시작하도록 등록한 경우 애플리케이션에서 알림 CLSID를 등록된 상태로 두는 것을 선호할 수 있습니다. 둘 이상의 애플리케이션이 BITS_JOB_PROPERTY_NOTIFICATION_CLSID 속성을 호출하도록 설정하는 경우 설정할 마지막 CLSID는 BITS가 콜백 개체를 인스턴스화하는 데 사용하는 것이며 다른 CLSID는 인스턴스화되지 않습니다. 마찬가지로 한 애플리케이션이 CLSID를 등록하고 다른 애플리케이션이 콜백 개체를 등록하는 경우 콜백 개체에 대한 일반적인 규칙이 우선 적용되며 콜백 개체가 지워지거나 연결이 끊어지지 않는 한 CLSID가 사용되지 않습니다.

다음 예제에서는 CLSID 알림에 등록하는 방법을 보여 줍니다. 이 예제에서는 IBackgroundCopyJob5 인터페이스 포인터가 유효하고 애플리케이션이 CNotifyInterface 클래스를 구현하는 out-of-process COM Server로 이미 등록되어 있다고 가정합니다. 다음 예제에서 사용되는 CNotifyInterface 예제 클래스에 대한 자세한 내용은 IBackgroundCopyCallback 인터페이스를 참조하세요.

HRESULT hr; 
IBackgroundCopyJob5* job; 
BITS_JOB_PROPERTY_VALUE propertyValue; 
propertyValue.ClsID = __uuidof(CNotifyInterface); 

hr = job->SetProperty(BITS_JOB_PROPERTY_NOTIFICATION_CLSID, propertyValue); 
if (SUCCEEDED(hr)) 
{ 
    hr = job->SetNotifyFlags(BG_NOTIFY_JOB_TRANSFERRED |  
                             BG_NOTIFY_JOB_ERROR); 
} 

if (FAILED(hr)) 
{ 
    // Handle error - unable to register callbacks. 
}