022 如何传参数给Filter?

Post date: 2015/4/14 上午 03:25:39

作者: soraking 时间: 2011-10-7 07:25 AM

标题: 如何传参数给Filter?

如何传参数给Filter? 如: TransFilter,我想传一个IP地址给它

作者: admin 时间: 2011-10-7 10:01 AM

自己定义一个COM接口,然后上层应用通过QueryInterface来获取这个接口,即COM对象,然后通过这个接口传参数进Filter。

作者: soraking 时间: 2011-10-7 10:50 AM

/*

0.设计人: Soraking,QQ:762804203, Email: ibbm@163.com

1.Filter名称: CNullInPlace

2.Filter接口类名称: INullIPP

3.接口类只有.h文件

4.Filter只有.cpp文件

*/

一.接口类的创建:Name:INULLIPP, File:INull.h

#ifndef __INULLIP__ //INULLIP是随便定义的一个类标识,用来告诉编译器

#define __INULLIP__

#ifdef __cplusplus

extern "C" {

#endif

//接口类的ID标识

DEFINE_GUID(IID_INullIPP,

0x43d849c0, 0x2fe8, 0x11cf, 0xbc, 0xb1, 0x44, 0x45, 0x53, 0x54, 0x00,

0x00);

//定义接口函数

DECLARE_INTERFACE_(INullIPP, IUnknown)

{

STDMETHOD(put_MediaType) (THIS_

CMediaType *pmt //函数参数,

若无参数直接(THIS)PURE

) PURE;

STDMETHOD(get_MediaType) (THIS_

CMediaType **pmt //返回参数

) PURE;

};

#ifdef __cplusplus

}

#endif

#endif // __INULLIP__

二.在Filter中使用接口类

1.包含接口类头文件:

#include "inull.h"

2.在类定义中,基于接口类

class CNullInPlace:public CTransInPlaceFilter

, public INullIPP //接口类名称

{...}

3.重载定义

public:

STDMETHODIMP put_MediaType(CMediaType *pmt);

STDMETHODIMP get_MediaType(CMediaType **pmt);

4.在CPP实现该函数

STDMETHODIMP CNullInPlace::put_MediaType(CMediaType *pmt)

{

//自己的处理程序

return HRESULT;

}

STDMETHODIMP CNullInPlace::get_MediaType(CMediaType **pmt)

{

//CMediaType m_mtPreferred;

*pmt = &m_mtPreferred;

return NOERROR;

}

三.在主程序中获得接口类

//1.将接口类的CLSID定义到主程序中

DEFINE_GUID(IID_INullIPP,0x43d849c0, 0x2fe8, 0x11cf, 0xbc, 0xb1,

0x44, 0x45, 0x53, 0x54, 0x00, 0x00);

//2.函数

HRESULT FindFilterInterface(

IGraphBuilder *pGraph, // Pointer to the Filter Graph

Manager.

REFGUID iid, // IID of the interface to retrieve.

void **ppUnk) // Receives the interface pointer.

{

if (!pGraph || !ppUnk) return E_POINTER;

HRESULT hr = E_FAIL;

IEnumFilters *pEnum = NULL;

IBaseFilter *pF = NULL;

if (FAILED(pGraph->EnumFilters(&pEnum)))

{

return E_FAIL;

}

// Query every filter for the interface.

while (S_OK == pEnum->Next(1, &pF, 0))

{

hr = pF->QueryInterface(iid, ppUnk);

pF->Release();

if (SUCCEEDED(hr))

{

break;

}

}

pEnum->Release();

return hr;

}

//3.调用

INullIPP* pINullIpp; //IPushSource是在Filter中自定义的接口类

FindFilterInterface(m_pGraphBuider,IID_INullIPP,(void**)&pINullIpp);

作者: soraking 时间: 2011-10-7 10:53 AM

然后就可以调用接口类的函数干想干的事了.

pINullIpp->put_MediaType(...)