Aracılığıyla paylaş


Hata Günlüğü Sınıfı Oluşturma

[DirectShow bu sayfayla ilişkilendirilmiş özellik eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun DirectShowyerine MediaPlayer, IMFMediaEngine ve Media Foundation’daki Audio/Video Capture kullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

[Bu API desteklenmez ve gelecekte değiştirilebilir veya kullanılamayabilir.]

Bu konuda, DirectShow Düzenleme Hizmetleri'nde hata günlüğünün nasıl uygulandığı açıklanmaktadır.

İlk olarak, hata günlüğü uygulayacak bir sınıf bildirin. sınıfı, IAMErrorLog arabirimini devralır. Üç IUnknown yöntemi ve IAMErrorLogiçindeki tek yöntem için bildirimler içerir. Sınıf bildirimi aşağıdaki gibidir:

class CErrReporter : public IAMErrorLog
{
protected:
    long    m_lRef; // Reference count.

public:
    CErrReporter() { m_lRef = 0; }

    // IUnknown
    STDMETHOD(QueryInterface(REFIID, void**));
    STDMETHOD_(ULONG, AddRef());
    STDMETHOD_(ULONG, Release());

    // IAMErrorLog
    STDMETHOD(LogError(LONG, BSTR, LONG, HRESULT, VARIANT*));
};

Sınıftaki tek üye değişken, nesnenin başvuru sayısını tutan m_lRef'tir.

Ardından, IUnknowniçindeki yöntemleri tanımlayın. Aşağıdaki örnekte, bu yöntemler için standart bir uygulama gösterilmektedir:

STDMETHODIMP CErrReporter::QueryInterface(REFIID riid, void **ppv)
{
    if (ppv == NULL) return E_POINTER;

    *ppv = NULL;
    if (riid == IID_IUnknown)
        *ppv = static_cast<IUnknown*>(this);
    else if (riid == IID_IAMErrorLog)
        *ppv = static_cast<IAMErrorLog*>(this);
        
    else 
    return E_NOINTERFACE;

    AddRef();
    return S_OK;
}

STDMETHODIMP_(ULONG) CErrReporter::AddRef()
{
    return InterlockedIncrement(&m_lRef);
}

STDMETHODIMP_(ULONG) CErrReporter::Release()
{
    // Store the decremented count in a temporary
    // variable. 
    ULONG uCount = InterlockedDecrement(&m_lRef);
    if (uCount == 0)
    {
        delete this;
    }
    // Return the temporary variable, not the member
    // variable, for thread safety.
    return uCount;
}

COM çerçevesi yerleşik olarak artık IAMErrorLog arabirimini uygulayabilirsiniz. Sonraki bölümde bunun nasıl yapılacağını açıklanmaktadır.

Kayıt Hataları