Ben en fait c'est un peu compliqué.... même beaucoup
en fait c'est un filtre que j'ai chopé sur le net :
quand le filtre est créé ca créé une classe qui fait pratiquement que le createinstance et qui lui appelle une autre classe qui fait "tout le travailé".... et je pense que la destruction du filtre detruit la premiere classe mais pas la deuxieme..
voila mon .h, si tu veux jeter un oeil :
#include "freeimage.h"
#include <iostream>
#pragma once
#define DECLARE_PTR(type, ptr, expr) type* ptr = (type*)(expr);
static const GUID CLSID_VirtualCAM;
class CVirtualCamStream;
/**
* @struct thread_param Structure de declaration de thread
* @param cvcs est une classe CVirtualCamStream
* @param soc : socket sur laquelle le programme va recevoir les paquets UDP
*/
struct thread_param{
CVirtualCamStream* cvcs;
SOCKET soc;
MEMOIRE memoire[NOMBRE_MEMOIRE];
};
class CVirtualCam : public CSource
{
public:
//////////////////////////////////////////////////////////////////////////
// IUnknown
//////////////////////////////////////////////////////////////////////////
static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
IFilterGraph *GetGraph() {return m_pGraph;}
private:
CVirtualCam(LPUNKNOWN lpunk, HRESULT *phr);
};
class CVirtualCamStream : public CSourceStream, public IAMStreamConfig, public IKsPropertySet
{
public:
/**
* Fonctions d'initialisation et de destruction de socket
*/
SOCKET CVirtualCamStream::SocketInitialise(SOCKET sock);
void CVirtualCamStream::SocketDeInitialise(SOCKET sock);
/**
* Fonction de creation de thread qui permet de faire tourner en parallele la fonction de reception des paquets
*/
static DWORD WINAPI CVirtualCamStream::ThreadReceptionImage(void *p)
{
struct thread_param *Obj = reinterpret_cast<struct thread_param*>(p);
CVirtualCamStream *c = Obj->cvcs;
return c->ReceptionImage(Obj->soc);
}
//////////////////////////////////////////////////////////////////////////
// IUnknown
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
STDMETHODIMP_(ULONG) AddRef() { return GetOwner()->AddRef(); } \
STDMETHODIMP_(ULONG) Release() { return GetOwner()->Release(); }
//////////////////////////////////////////////////////////////////////////
// IQualityControl
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);
//////////////////////////////////////////////////////////////////////////
// IAMStreamConfig
//////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt);
HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize);
HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC);
//////////////////////////////////////////////////////////////////////////
// IKsPropertySet
//////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwID, void *pInstanceData, DWORD cbInstanceData, void *pPropData, DWORD cbPropData);
HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, void *pInstanceData,DWORD cbInstanceData, void *pPropData, DWORD cbPropData, DWORD *pcbReturned);
HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
//////////////////////////////////////////////////////////////////////////
// CSourceStream
//////////////////////////////////////////////////////////////////////////
CVirtualCamStream(HRESULT *phr, CVirtualCam *pParent, LPCWSTR pPinName);
~CVirtualCamStream();
HRESULT FillBuffer(IMediaSample *pms);
HRESULT DecideBufferSize(IMemAllocator *pIMemAlloc, ALLOCATOR_PROPERTIES *pProperties);
HRESULT CheckMediaType(const CMediaType *pMediaType);
HRESULT GetMediaType(int iPosition, CMediaType *pmt);
HRESULT SetMediaType(const CMediaType *pmt);
HRESULT OnThreadCreate(void);
HRESULT ShutdownThread( );
private:
CVirtualCam *m_pParent;
REFERENCE_TIME m_rtLastTime;
HBITMAP m_hLogoBmp;
CCritSec m_cSharedState;
IReferenceClock *m_pClock;
FILE* pFile;
/**
* @param sock correspond à la socket sur laquelle nous communiquons
* @param WSAData utile pour la création de la socket
*/
SOCKET sock;
WSADATA WSAData;
/**
* Cette fonction doit être déclarée en static car appelée par un thread
*/
DWORD ReceptionImage(SOCKET sock);
HANDLE hthread;
DWORD hthreadId;
HANDLE m_hShutdownEvent;
bool stop;
};
encore merci de t'interesser a mon cas ;)