Filter编写之 自定义接口实例

 

我自己写了个filter,后来为了给filter发消息叫filter存储一张图片。所以我自己定义一个接口,接口文件如下:
// {EF31F705-32A7-477a-90C9-2C7E81EB025D}
#ifndef __H_MyFilter__
#define __H_MyFilter__

#ifdef __cplusplus
extern "C" {
#endif

DEFINE_GUID(IID_IMyFilter, 
0xef31f705, 0x32a7, 0x477a, 0x90, 0xc9, 0x2c, 0x7e, 0x81, 0xeb, 0x2, 0x5d);

DECLARE_INTERFACE_(IMyFilter,IUnknown)
{
  STDMETHODIMP SetCISSaveImage();
};
#ifdef __cplusplus
}
#endif

#endif 
在filter类中我加入了
.h文件
class CISFilter : public CTransformFilter
,public IMyFilter
{
  virtual HRESULT SetCISSaveImage(); 
}
.cpp文件
HRESULT CISFilter::SetCISSaveImage()
{
m_bSetSaveImage = true;

return S_OK;
}
编译生成CISFilter.ax文件
我在外面应用程序中调用这个filter的自定义接口
.h文件
/*自定义接口*/
IMyFilter *m_pMyFilter;  
.cpp文件中
hr = pGraphBuilder->QueryInterface(IID_IMyFilter,(void**)&m_pMyFilter);
if(FAILED(hr)) return;
hr = m_pMyFilter->SetCISSaveImage();  
编译通过,出现连接错误:
error LNK2019: 无法解析的外部符号 "public: long __cdecl IMyFilter::SetCISSaveImage(void).........
请问怎么在外部函数中调用自己定义的函数?

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

自己解决了,函数方式写的不对,改成
// {EF31F705-32A7-477a-90C9-2C7E81EB025D}
#ifndef __H_MyFilter__
#define __H_MyFilter__

#ifdef __cplusplus
extern "C" {
#endif

DEFINE_GUID(IID_IMyFilter, 
0xef31f705, 0x32a7, 0x477a, 0x90, 0xc9, 0x2c, 0x7e, 0x81, 0xeb, 0x2, 0x5d);

DECLARE_INTERFACE_(IMyFilter,IUnknown)
{
STDMETHOD(SetCISSaveImage) (THIS) PURE;
  // HRESULT SetCISSaveImage();
};
#ifdef __cplusplus
}
#endif

#endif 
就OK了,50分谁要送人了!

教程:

DirectShow开发指南· 陆琪明· 第4章Filter组件的开发4.5.4自定义接口...

 /////////////////////////////////////////////////////////////////////////////////////

 

首先先定义一个filter的接口,头文件为ITitleOverlay.h ,定义如下
DEFINE_GUID(IID_ITitleOverlay,
0x5e5b3386, 0x6f9f, 0x4a47, 0xac, 0x8b, 0x7a, 0x30, 0x21, 0x38, 0xd7, 0xff);
ID号可以由vc++自带的代码生成器生成
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
// ITitleOverlay
//----------------------------------------------------------------------------
DECLARE_INTERFACE_(ITitleOverlay, IUnknown)
{
// 设置Filter进行叠加的类型,如果需要改变类型,这个函数必须第一个设置,
// 调用这个函数成功后,才能调用其他的函数进行参数设置。
// 可以设置的叠加类型参见枚举类型OVERLAY_TYPE的定义。
STDMETHOD(put_TitleOverlayType) (THIS_
  long inOverlayType  
) PURE;
}
//可以加入多个函数,用于与外部变量的沟通
接下来在filter的类定义中继承这个接口并实现里面定义的函数就可以了
给你个网址你自己下载代码看一下吧,Chapter04的FilterTitleOverlay有怎样实现属性页和接口的例子

 自定义接口的例子:

DXSDK/Samples/C++/DirectShow/Filters/EZRGB24

自定义 filter 接口在编程中可能遇到的问题:

1 出现错误:

 

思路是 在自定义接口

ECLARE_INTERFACE_(INetworkSettings, IUnknown)

    {

        STDMETHOD(SetRemoteIPAddress) (THIS_

char* RemoteIP) PURE;

        STDMETHOD(SetRemotePort) (THIS_

DWORD  RemotePort) PURE;                 

    };

我实现了这两个函数(虚函数)所以在其子类CMpeg4Filter中必须实例化这两个函数,

接着我在CMpeg4Filte中实例化了这两个函数 但是还是报错 

 

CUnknown * __stdcall CMpeg4Filter::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)

{

 ASSERT(phr);

 CUnknown *punk = new CMpeg4Filter(NAME ("Mpeg4Filter"),lpunk, phr);//错误出现处

 error C2259: 'CMpeg4Filter' : cannot instantiate abstract class due to following members:

意思是 这个CMpeg4Filter是一个抽象类 无法实例化

究其原因是 在自定义接口的子类中还要添加

DECLARE_IUNKNOWN  宏

如下位置:

 

class CMpeg4Filter:public CBaseFilter

                  ,public INetworkSettings 

{

 

public:

static CUnknown *  __stdcall CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);

   DECLARE_IUNKNOWN;

   重新定义 IUNKNOW中 的三个 虚函数,

自此 编译无错。

 

 

 

 

你可能感兴趣的:(编程,c,filter,存储,Class,interface)