Date

ほんのちょっとしたTipsというかIdeaのようなもの。

DirectShow Q&Aでも挙げたが、DLLではなくアプリケーション内部に「プライベートなフィルタ」(外部に公開しないフィルタ)を作ることができる。プライベートなフィルタはCoCreateInstanceの代わりにnewを使ってインスタンスを作成する。

1
2
HRESULT hr = NOERROR;
CMyPrivateFilter * pFilter = new CMyPrivateFilter(NULL, &hr);

newしたらdeleteしなければならないが、BaseClassesを使って実装したフィルタの場合、参照カウンタが0になった時点でdelete this;を実行するので、インスタンスを作成した側からはdeleteする必要がない。(むしろ、してはいけない。)これはややこしいな、と。

regsvr32.exe でレジストリに登録した「パブリックなフィルタ」はCoCreateInstanceでインスタンスを作成する。このときフィルタプロジェクト内のCFactoryTemplateで指定した、ファクトリーメソッドが呼ばれる。

1
2
3
CFactoryTemplate g_Templates [] = {
    { TEMPLATE_NAME, &__uuidof(CMyPublicFilter), CMyPublicFilter::CreateInstance, NULL, &afFilterInfo },
};

プライベートなフィルタでもファクトリーメソッドを実装して、それを呼び出すことによりインスタンスを作成してみてはどうだろう。例えば…

1
2
3
hr = NOERROR;
CUnknown *pUnknown = CMyPrivateFilter::CreateInstance(NULL, &hr);
pUnknown->NonDelegatingQueryInterface(IID_IBaseFilter, (void**)&pFilter);

これでnewを呼び出す個所が一か所になる。


Comments

comments powered by Disqus