DirectShow のCSampleGrabber フィルタサンプルで、リンクエラーが発生

DirectShow の CSampleGrabber サンプルプログラムを改造して、ビデオファイルからサムネイルを取得するプログラムを作成中。
CSampleGrabber サンプルプログラムは、MSDN for .NET 2003 には載っているんだけど、どこを探しても見あたらない。
DirectX 9c SDKのインストールでもインストールされないみたい。

でも、マニュアルでもWebでも、当然あるものとして解説されていた。
不思議だ。

いろいろ探して約2日後、DirectX 9.0 のフルインストールCD-ROMの中に収録されているのを発見しました。
Webが最新だからと、もらったは良いが1度も使っていなかったCD-ROMでした。
やっと、その真価を発揮する事が出来ました。
[未だに、オンラインでGET出来る方法が見つからない(;_;)]

やろうとしている事は、このサンプル。
How To Get Data from a Microsoft DirectShow Filter Graph
Microsoft DirectShow フィルタ グラフからデータを取得する方法

※日本語訳版のソースコードは翻訳時に一部欠けてしまっているようです。

テストプロジェクトを作成して、試してから、いざ本番アプリケーションに組み込もうとすると、問題が発生しました。
リンクエラーが発生したのです。

リンクしています...
SampleGrabber.obj : error LNK2001: 外部シンボル ""public: virtual long __stdcall CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAGJPAPA_W@Z)" は未解決です。
SampleGrabber.obj : error LNK2001: 外部シンボル ""public: virtual long __stdcall CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAGJPAUIFilterGraph@@PB_W@Z)" は未解決です。
SampleGrabber.obj : error LNK2001: 外部シンボル ""public: virtual long __stdcall CTransformFilter::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CTransformFilter@@UAGJPB_WPAPAUIPin@@@Z)" は未解決です。
SampleGrabber.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CTransInPlaceInputPin::CTransInPlaceInputPin(char *,class CTransInPlaceFilter *,long *,wchar_t const *)" (??0CTransInPlaceInputPin@@QAE@PADPAVCTransInPlaceFilter@@PAJPB_W@Z) が関数 "public: __thiscall CSampleGrabberInPin::CSampleGrabberInPin(class CTransInPlaceFilter *,long *)" (??0CSampleGrabberInPin@@QAE@PAVCTransInPlaceFilter@@PAJ@Z) で参照されました。
Debug/ISearch.exe : fatal error LNK1120: 外部参照 4 が未解決です。


多分、WCHAR の定義がライブラリ側とアプリ側で異なる事が原因と思いました。
WCHAR は、unsigned short の typedef の場合と、組込型の wchar_t の typedef の場合の2種類があります。
なので、これが原因なのではないかと勘ぐり、いろいろと設定やコードを変更してみたのですが、なかなかコンパイラをだますのは難しい、、、断念しました。

で、やってみたのは、BaseClasses の .cpp ファイルをすべてアプリのプロジェクトに追加。
プロジェクトと一緒にコンパイルしちゃう事で、リンクエラーが解消されました。
でも、これらは、本当は、ライブラリファイル strmbasd.lib に入っていなくてはいけない関数たち。

やっぱり、コンパイラの設定か、プリプロセッサによる置換で、型の互換性が一致していないのが原因のような気がしています。
悩ましい。。。

時間がないので、抜本的な解決方法の探索は後回し。
[PR]
by isoq | 2006-03-24 20:29 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< PC不安定・インストール失敗の... 迷惑メール >>