Aracılığıyla paylaş


COM Geriçağırım Kaydetme

bir işin durumundaki değişiklikleri yoklamak yerine, işin durumu değiştiğinde bildirim almak için kaydolabilirsiniz. Bildirim almak için IBackgroundCopyCallback2 arabirimini uygulamanız gerekir. Arabirim, kaydınıza bağlı olarak BITS'in çağırdığı aşağıdaki metotları içerir:

IBackgroundCopyCallback2 arabirimini uygulayan bir örnek için IBackgroundCopyCallback arabirimi konusunun örnek koduna bakın.

IBackgroundCopyCallback2 arabirimi, bir dosya aktarıldığında bildirim sağlar. Genellikle, dosyayı doğrulamak için bu yöntemi kullanırsınız, böylece dosya eşlerin indirebilmesi için kullanılabilir; aksi takdirde, IBackgroundCopyJob::Complete yöntemini çağırana kadar dosya eşler tarafından kullanılamaz. Dosyayı doğrulamak için IBackgroundCopyFile3::SetValidationState yöntemini çağırın.

COM geri çağırmasını kaydetmek için iki yöntem vardır: geri çağırma nesnesini kaydetme veya geri çağırma sınıfı kimliğini kaydetme. Geri çağırma nesnesi kullanmak daha basit ve daha düşük bir ek yük oluşturur; geri çağırma CLSID kullanmak daha güvenilir ancak daha karmaşıktır. Her ikisini de veya hiçbirini kaydedebilirsiniz– BITS varsa ve hala çağrılabilirse bir geri çağırma nesnesi kullanır ve başarısız olursa sağlanan sınıf kimliğine göre yeni bir nesne örneği oluşturmak için geri döner.

Geri Çağırma Nesnesi Kaydetme

Uygulamanızı BITS'ye kaydetmek için IBackgroundCopyJob::SetNotifyInterface yöntemini çağırın. BITS çağrılarının hangi yöntemlerini belirtmek için IBackgroundCopyJob::SetNotifyFlagsyöntemini çağırın.

Uygulamanız sonlandırıldığında bildirim arabirimi geçersiz hale gelir; BITS bildirim arabirimini kalıcı yapmaz. Sonuç olarak, uygulamanızın başlatma işlemi bildirim almak istediğiniz mevcut işleri kaydetmelidir. Uygulamanızın en son çalıştırıldığından bu yana oluşan durum ve ilerleme durumu bilgilerini yakalamanız gerekiyorsa, uygulama başlatma sırasında durum ve ilerleme durumu bilgilerini yoklama.

Uygulamanız çıkmadan önce geri çağırma arabirimi işaretçisini (SetNotifyInterface(NULL)) temizlemelidir. Geri çağırma işaretçisini temizlemek, BITS'in artık geçerli olmadığını keşfetmesine izin vermekten daha verimlidir.

İş için bildirim arabirimini ayarlamak için birden fazla uygulama SetNotifyInterface yöntemini çağırırsa, SetNotifyInterface yöntemini çağıran son uygulamanın bildirim alacak olan uygulama olduğunu, diğer uygulamaların bildirim almayacaklarını unutmayın.

Aşağıdaki örnek, bildirimlere nasıl kaydolacağınızı gösterir. Örnekte IBackgroundCopyJob arabirim işaretçisinin geçerli olduğu varsayılır. Aşağıdaki örnekte kullanılan CNotifyInterface örnek sınıfının ayrıntıları için IBackgroundCopyCallbackarabirimibakın.

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.
    }
}

Geri Çağırma CLSID'sini kaydetme

BITS ile geri çağırma CLSID'sini kaydetmek için BITS_JOB_PROPERTY_NOTIFICATION_CLSID PropertyId ile IBackgroundCopyJob5::SetPropertyyönteminiçağırın. BITS çağrılarının hangi yöntemlerini belirtmek için IBackgroundCopyJob::SetNotifyFlags yöntemini çağırın.

CLSID'yi bir BITS işine kaydetmeden önce CLSID bildiriminin işlem dışı bir COM sunucusuna kayıtlı olduğundan emin olmanız gerekir. COM sunucusu uygulamak, bir geri çağırma nesnesi tanımlayıp geçirmekten çok daha karmaşıktır, ancak birkaç önemli avantaj sunar. COM sunucusu, BITS'nin bir BITS işi ile uygulamanızın kodu arasındaki ilişkiyi sistem yeniden başlatmaları arasında ve büyük veya uzun ömürlü işler için korumasını sağlar. COM sunucusu, BITS arka planda aktarımları yürütmeye devam ederken uygulamanızın tamamen kapanmasına da olanak tanır ve bu da sistemin pil, CPU ve bellek kullanımını iyileştirebilir.

Almak için kaydolduğunuz bir bildirimi iletmek üzere, BITS önce eklediğiniz mevcut geri çağırma nesnesinin ilgili yöntemini çalıştırmayı dener. Var olan bir nesne yoksa veya mevcut nesnenin bağlantısı kesildiyse (genellikle uygulamanızın sonlandırmasının bir sonucu olarak), BITS yeni bir geri çağırma nesnesinin örneğini oluşturmak için bildirim CLSID'sini kullanarak CoCreateInstance'ı çağırır ve bağlantısı kesilene veya IBackgroundCopyJob yeni bir çağrıyla değiştirilene kadar bu nesneyi daha fazla geri çağırma için kullanır: SetNotifyInterface.

Geri çağırma nesnelerinden farklı olarak, BITS hizmeti veya sistem kapatılır ve yeniden başlatılırsa, geri çağırma CLSID’leri, karşılık gelen BITS işleriyle birlikte kaydedilir. Uygulamanız, GUID_NULL için yeni bir bildirim CLSID'si geçirerek (veya herhangi bir başka zaman) çıkmadan önce önceden ayarlanmış bildirim CLSID'sini temizleyebilir. Ancak, uygulamanız CLSID'niz için yapılacak CoCreateInstance isteklerine yanıt olarak COM'un uygulamanızı çalıştırması için kaydolduysa, bildirim CLSID'sini kayıtlı bırakmayı tercih edebilir. Birden fazla uygulama BITS_JOB_PROPERTY_NOTIFICATION_CLSID özelliğini çağırırsa, ayarlanacak son CLSID'nin BITS'nin geri çağırma nesnelerinin örneğini oluştururken kullanacağı clsid olduğunu unutmayın; diğer CLSID'lerin örneği oluşturulmayacak. Benzer şekilde, bir uygulama bir CLSID kaydederse ve başka bir geri çağırma nesnesi kaydederse, öncelik alan geri çağırma nesnesi için olağan kurallar uygulanır ve geri çağırma nesnesi temizlenmediği veya bağlantısı kesilmediği sürece CLSID kullanılmaz.

Aşağıdaki örnekte CLSID bildirimlerine nasıl kaydolduğu gösterilmektedir. Örnek, IBackgroundCopyJob5arabirim işaretçisinin geçerli olduğunu ve uygulamanızın CNotifyInterface sınıfını uygulayan işlem dışı bir COM Sunucusu olarak zaten kaydedildiğini varsayar. Aşağıdaki örnekte kullanılan CNotifyInterface örnek sınıfının ayrıntıları için IBackgroundCopyCallbackarabirimibakın.

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. 
}