Я пришел из c # фона и подумал, что на каком-то уровне я мог бы просто передать ссылку на метод. Это не похоже на случай. Вместо этого требуется создать класс, реализующий его интерфейс, который определяет метод, который он будет вызывать. Затем вы передаете экземпляр класса фильтру в методе SetCallback. Конечно, кажется, что оно выглядит многословно по сравнению с делегатом или лямбда-выражением
Вот пример класса, реализующего ISampleGrabberCB
class SampleGrabberCallback : public ISampleGrabberCB
{
public:
// Fake referance counting.
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 2; }
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject)
{
if (NULL == ppvObject) return E_POINTER;
if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast<IUnknown*>(this);
return S_OK;
}
if (riid == __uuidof(ISampleGrabberCB))
{
*ppvObject = static_cast<ISampleGrabberCB*>(this);
return S_OK;
}
return E_NOTIMPL;
}
STDMETHODIMP SampleCB(double Time, IMediaSample *pSample)
{
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
return E_NOTIMPL;
}
};