Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Birden fazla zaman uyumsuz yöntem çağırırsanız, her biri için ayrı bir IMFAsyncCallback::Invokeuygulaması gereklidir. Ancak, geri çağırmaları tek bir C++ sınıfı içinde uygulamak isteyebilirsiniz. Sınıfın yalnızca bir Invoke yöntemi olabilir, bu nedenle çözümlerden biri kapsayıcı sınıfındaki başka bir yönteme Invoke çağrıları temsilciler sağlayan bir yardımcı sınıf sağlamaktır.
Aşağıdaki kodda, bu yaklaşımı gösteren AsyncCallbackadlı bir sınıf şablonu gösterilmektedir.
//////////////////////////////////////////////////////////////////////////
// AsyncCallback [template]
//
// Description:
// Helper class that routes IMFAsyncCallback::Invoke calls to a class
// method on the parent class.
//
// Usage:
// Add this class as a member variable. In the parent class constructor,
// initialize the AsyncCallback class like this:
// m_cb(this, &CYourClass::OnInvoke)
// where
// m_cb = AsyncCallback object
// CYourClass = parent class
// OnInvoke = Method in the parent class to receive Invoke calls.
//
// The parent's OnInvoke method (you can name it anything you like) must
// have a signature that matches the InvokeFn typedef below.
//////////////////////////////////////////////////////////////////////////
// T: Type of the parent object
template<class T>
class AsyncCallback : public IMFAsyncCallback
{
public:
typedef HRESULT (T::*InvokeFn)(IMFAsyncResult *pAsyncResult);
AsyncCallback(T *pParent, InvokeFn fn) : m_pParent(pParent), m_pInvokeFn(fn)
{
}
// IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
{
static const QITAB qit[] =
{
QITABENT(AsyncCallback, IMFAsyncCallback),
{ 0 }
};
return QISearch(this, qit, riid, ppv);
}
STDMETHODIMP_(ULONG) AddRef() {
// Delegate to parent class.
return m_pParent->AddRef();
}
STDMETHODIMP_(ULONG) Release() {
// Delegate to parent class.
return m_pParent->Release();
}
// IMFAsyncCallback methods
STDMETHODIMP GetParameters(DWORD*, DWORD*)
{
// Implementation of this method is optional.
return E_NOTIMPL;
}
STDMETHODIMP Invoke(IMFAsyncResult* pAsyncResult)
{
return (m_pParent->*m_pInvokeFn)(pAsyncResult);
}
T *m_pParent;
InvokeFn m_pInvokeFn;
};
Şablon parametresi kapsayıcı sınıfının adıdır.
AsyncCallback oluşturucunun iki parametresi vardır: kapsayıcı sınıfına yönelik bir işaretçi ve kapsayıcı sınıfındaki geri çağırma yönteminin adresi. Kapsayıcı sınıfı, AsyncCallback sınıfının birden çok örneğine üye değişkenleri olarak sahip olabilir; her bir asenkron yöntem için bir tane. Kapsayıcı sınıfı zaman uyumsuz bir yöntemi çağırdığında, uygun AsyncCallback nesnesinin IMFAsyncCallback arabirimini kullanır.
AsyncCallback nesnesinin Invoke yöntemi çağrıldığında, çağrı kapsayıcı sınıfında doğru yönteme temsilci olarak atanır.
AsyncCallback nesnesi ayrıca AddRef ve Release çağrılarını kapsayıcı sınıfına devrederek kapsayıcı sınıfının AsyncCallback nesnesinin ömrünü yönetmesini sağlar. Bu, kapsayıcı nesnesinin kendisi silinene kadar AsyncCallback nesnesinin silinmeyeceğini garanti eder.
Aşağıdaki kodda bu şablonun nasıl kullanılacağı gösterilmektedir:
#pragma warning( push )
#pragma warning( disable : 4355 ) // 'this' used in base member initializer list
class CMyObject : public IUnknown
{
public:
CMyObject() : m_CB(this, &CMyObject::OnInvoke)
{
// Other initialization here.
}
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
STDMETHODIMP QueryInterface(REFIID iid, void** ppv);
private:
AsyncCallback<CMyObject> m_CB;
HRESULT OnInvoke(IMFAsyncResult *pAsyncResult);
};
#pragma warning( pop )
Bu örnekte kapsayıcı sınıfı CMyObjectolarak adlandırılmıştır.
m_CB üye değişkeni bir AsyncCallback nesnesidir.
CMyObject oluşturucuda, m_CB üye değişkeni CMyObject::OnInvoke yönteminin adresiyle başlatılır.
İlgili konular