我自己写了个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中 的三个 虚函数,
自此 编译无错。