非同期コールバックの実装
次のコードは、 IMFAsyncCallback インターフェイスを実装するために必要な基本的なフレームワークを示しています。 この例では、 Invoke メソッドは純粋仮想メソッドとして宣言されています。 このメソッドの実装は、呼び出す非同期メソッドによって異なります。 詳細については、「 非同期メソッドの呼び出し」を参照してください。
#include <shlwapi.h>
class CAsyncCallback : public IMFAsyncCallback
{
public:
CAsyncCallback () : m_cRef(1) { }
virtual ~CAsyncCallback() { }
STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
{
static const QITAB qit[] =
{
QITABENT(CAsyncCallback, IMFAsyncCallback),
{ 0 }
};
return QISearch(this, qit, riid, ppv);
}
STDMETHODIMP_(ULONG) AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) Release()
{
long cRef = InterlockedDecrement(&m_cRef);
if (cRef == 0)
{
delete this;
}
return cRef;
}
STDMETHODIMP GetParameters(DWORD* pdwFlags, DWORD* pdwQueue)
{
// Implementation of this method is optional.
return E_NOTIMPL;
}
STDMETHODIMP Invoke(IMFAsyncResult* pAsyncResult) = 0;
// TODO: Implement this method.
// Inside Invoke, IMFAsyncResult::GetStatus to get the status.
// Then call the EndX method to complete the operation.
private:
long m_cRef;
};
次のコードは、 から CAsyncCallback
派生するクラスの実装例を示しています。
class CMyCallback : public CAsyncCallback
{
HANDLE m_hEvent;
IMFByteStream *m_pStream;
HRESULT m_hrStatus;
ULONG m_cbRead;
public:
CMyCallback(IMFByteStream *pStream, HRESULT *phr)
: m_pStream(pStream), m_hrStatus(E_PENDING), m_cbRead(0)
{
*phr = S_OK;
m_pStream->AddRef();
m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (m_hEvent == NULL)
{
*phr = HRESULT_FROM_WIN32(GetLastError());
}
}
~CMyCallback()
{
m_pStream->Release();
CloseHandle(m_hEvent);
}
HRESULT WaitForCompletion(DWORD msec)
{
DWORD result = WaitForSingleObject(m_hEvent, msec);
switch (result)
{
case WAIT_TIMEOUT:
return E_PENDING;
case WAIT_ABANDONED:
case WAIT_OBJECT_0:
return m_hrStatus;
default:
return HRESULT_FROM_WIN32(GetLastError());
}
}
ULONG GetBytesRead() const { return m_cbRead; }
STDMETHODIMP Invoke(IMFAsyncResult* pResult)
{
m_hrStatus = m_pStream->EndRead(pResult, &m_cbRead);
SetEvent(m_hEvent);
return S_OK;
}
};
次の使用例は、 Invoke メソッド内のイベントを通知します。 さまざまなオプションの詳細については、「 非同期メソッドの呼び出し」を参照してください。
関連トピック