DirectShowのフィルタのメソッドを呼び出す

フィルタが持つメソッドを呼び出すことができれば,プログラミングの幅は広がる.たとえば,特徴点検出フィルタを作っておき,プログラム側から定期的にフィルタのメソッドから特徴点の座標を取得することができる.
フィルタ側は,フィルタをコントロールするためのインタフェースを用意し,そのインタフェースを継承する.インタフェースの持つメソッドがフィルタのメソッドに対応し,インタフェースのメソッドを呼び出すことで,フィルタのメソッドを呼び出すことができるのである.
プログラム側からは,上で実装したフィルタをコントロールするためのインタフェースを作成し,そのインタフェースを通じて,フィルタのメソッドを呼び出すことになる.

インタフェースを実装する

 IThrough.hの中身である.当然,このGUIDは,もとのThoughフィルタとは異なるものを割り当てる.

#ifndef __ITHROUGHEX__
#define __ITHROUGHE__
#define PARAM_MESSAGE_FROM_FILTER 1
// IThroughExインタフェースのGUID
/*  ̄ ̄ ̄ ̄ */
DEFINE_GUID( IID_IThroughEx, ̄ ̄ ̄ ̄);
//////////////////////////////////////////////////////////////////////
// インタフェース
MIDL_INTERFACE(" ̄ ̄ ̄ ̄")
IThroughEx : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Call( void ) = 0;
};
#endif

ここのSTDMETOHDCALLTYPEにプログラムから呼び出すメソッドを指定する.ここでは,Callをメソッドとして指定している.

フィルタ側のプログラム

フィルタ側には,メッセージを判別するNonDelegatinQueryInterfaceと,呼び出すためのCallを実装する.

STDMETHOD(NonDelegatingQueryInterface)(REFIID riid, void **ppv);
STDMETHODIMP Call( void );

 これをフィルタのヘッダファイルで宣言する.次にこれに対応するメソッドをThroughに実装する.

//////////////////////////////////////////////////////////////////////
// 外部から呼び出されるためのインタフェースの提供
STDMETHODIMP Through::NonDelegatingQueryInterface(REFIID riid, void **ppv){
// フィルタのインターフェース
if( riid==IID_IThrougx)
return GetInterface( (IThrough *)this,ppv );
return CTransformFilter::NonDelegatingQueryInterface( riid,ppv );
}
//////////////////////////////////////////////////////////////////////
// 外部から呼び出されるインタフェースの実装
STDMETHODIMP Through::Call(void){
CAutoLock cAutolock(&m_ThroughLock);
MessageBox( NULL, "プログラムからメソッドを呼び出されました.","ThroughFilter",MB_OK);
return NOERROR;
}

 実装部である.インタフェースが要求されたときに,IThroughが返されるように,NonDelegatingQueryInterfaceを実装する.Callは,必要な処理を書き込む.

IThrough	*m_pIThrough;

 フィルタのインタフェースとして,IThroughを宣言する.そして,インタフェースとして利用するようにポインタをフィルタから取得する.

hResult = m_pThroughEx->QueryInterface(IID_IThroughEx,(void **)&m_pIThroughEx);
if (hResult != S_OK)return FALSE;

 これで,ThroughのCallをIThroughインタフェースから呼び出すことができる.
http://code.google.com/p/sonson-code/source/browse/#svn/trunk/gl/GLUTtexture