本例子是在virtualcamera的基础上添加的自定义接口用来实现exe控制osd的显示。
1. 接口部分
#ifndef __h_myfilter__ #define __h_myfilter__ #ifdef __cplusplus extern "c" { #endif //#include <initguid.h> //extern_guid extern_guid(iid_imyfilter, 0xef31f705, 0x32a7, 0x477a, 0x90, 0xc9, 0x2c, 0x7e, 0x81, 0xeb, 0x2, 0x5d); declare_interface_(imyfilter,iunknown) { stdmethod(setosd) (this_ int osd_en) pure; }; } #endif
2.filter继承接口
#include "myfilter.h"
class cvcam : public csource ,public imyfilter
public:
static cunknown * winapi createinstance(lpunknown lpunk, hresult *phr);
stdmethodimp nondelegatingqueryinterface(refiid riid, void **ppv);//????
declare_iunknown;
stdmethodimp setosd(int osd_en);
ifiltergraph *getgraph() {return m_pgraph;}
int osd_enable;
private:
cvcam(lpunknown lpunk, hresult *phr);
cvcampin *m_ppin;
/////////////////////////////////////
stdmethodimp cvcam::setosd(int osd_en)
osd_enable = osd_en;
return s_ok;
stdmethodimp cvcam::nondelegatingqueryinterface(refiid riid, void **ppv)
if(riid == _uuidof(iamstreamconfig) || riid == _uuidof(ikspropertyset))
// m_pastreams[0]->queryinterface(riid, ppv);
return m_pastreams[0]->queryinterface(riid, ppv);
else if (riid == iid_imyfilter)
return getinterface((imyfilter *) this, ppv);
else
return cbasefilter::nondelegatingqueryinterface(riid, ppv);//修改
3.应用程序调用
//根据guid 查找filter
hr = cocreateinstance(clsid_myfilter, 0, clsctx_inproc_server, iid_ibasefilter, reinterpret_cast<void**>(&psrcfilter));
imyfilter *pinterface = null;
hr = psrcfilter->queryinterface(iid_imyfilter, (void **)&pinterface);//从filter上查询接口
pinterface->setosd(0);//使用接口函数