J'écris du code pour gérer l'entrée vidéo de certaines caméras en utilisant DirectShow, donc je dois implémenter ISampleGrabberCB.Pourquoi VC2008 pense que cette classe est abstraite?
Ma classe qui implémente l'interface se compile bien, mais lorsque j'essaie de l'instancier, le compilateur lève "error C2259: 'SampleGrabberCB' : cannot instantiate abstract class
".
Voici l'interface que je suis mise en œuvre:
interface ISampleGrabberCB : public IUnknown {
virtual STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample) = 0;
virtual STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen) = 0;
};
Voici ma tête de SampleGrabberCB:
#pragma once
#include "stdafx.h"
class SampleGrabberCB : public ISampleGrabberCB {
private:
int _refCount;
DShowCaptureDevice* _parent;
public:
// SampleGrabberCB();
SampleGrabberCB(DShowCaptureDevice* parent);
~SampleGrabberCB();
virtual STDMETHODIMP BufferCB(double sampleTime, BYTE* pBuffer, long bufferLen);
virtual STDMETHODIMP SampleCB(double sampleTime, IMediaSample * pSample, long bufferLen);
#pragma region IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) {
if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown) {
*ppv = (void *) static_cast<ISampleGrabberCB*> (this);
return NOERROR;
}
return E_NOINTERFACE;
}
virtual ULONG STDMETHODCALLTYPE AddRef() {
return ++_refCount;
}
virtual ULONG STDMETHODCALLTYPE Release() {
int n = --_refCount;
if (n <= 0) {
delete this;
}
return n;
}
#pragma endregion
};
et c'est la mise en œuvre SampleGrabberCB.cpp:
#include "StdAfx.h"
#include "SampleGrabberCB.h"
//SampleGrabberCB::SampleGrabberCB() {
// _parent = NULL;
//}
SampleGrabberCB::SampleGrabberCB(DShowCaptureDevice* parent) {
_parent = parent;
}
SampleGrabberCB::~SampleGrabberCB() {
}
STDMETHODIMP SampleGrabberCB::BufferCB(double sampleTime, BYTE *pBuffer, long bufferLen) {
// dummy value for now
return -50;
}
STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen) {
// dummy value for now
return 100;
}
ici est comment je l'utilise:
SampleGrabberCB* callback = new SampleGrabberCB(device);
Des idées? Merci!
Le compilateur vous indiquera généralement ce qui manque dans le reste du message d'erreur. –
Le compilateur n'a pas, cependant. C'est le seul message d'erreur qu'il a donné, et comme je l'ai dit, ma classe compile bien. – Dai