DirectShow 開発メモ

忘れそうなのでこのあたりで一度 DirectShow 開発でつまづいた点を書いておきたいと思います。(ほとんど自分用のメモ代わりです…)

DirectShow のサンプルをビルドすると、リンク時に「largeint.lib がない」とエラーが出る

DirectX 9.0 SDK Update(2005 Feb) Extra 以前の DirectShow に付属のサンプルをビルドしようとするとこのエラーが起きるようです。VisualStudio2005 や C++Builder2007 では不要になったので削除すれば問題ありません。(ソース)

Vista で regsvr32 で DirectShow フィルタの登録ができない

普通に regsvr32 で登録しようとすると、このようなエラーが出て登録できません。

モジュール "〜.ax" は読み込まれましたが、
DllRegisterServer への呼び出しはエラーコード
0x80070005 により失敗しました。

エラーコード 0x80070005 を検索すると「アクセスが拒否された」とのことで、現時点でわかっている解決策は、以下の 2 種類です。

  • VisualStudio2005 を管理者権限で立ち上げ、「ビルド後のイベント」に regsvr32 の行を記述しておき、VisualStudio に実行してもらう
  • コマンドプロンプトを管理者権限で実行し、regsvr32 を手動で打ち込む(10/8 追記: あるいはその行を記述したバッチファイルをコマンドプロンプト上で実行する)

もっとも、XP では GUI 上から登録できる GuiRegsvr を愛用していましたが、これが Vista になってから実質使えなくなっていて困っています。

  • GuiRegsvr を普通に実行→フィルタは読み込めるが、登録に失敗
  • GuiRegsvr を管理者権限で実行→そもそもフィルタが読み込めない

どうも管理者権限で実行すると、Program Files 以下にあるファイルしか読み書きできなくなっているようです。(調査中…と言いつつもこのあたりの情報にかなり飢えています…)
(10/8 追記)「regsvr32 〜.ax」と書いたバッチファイルを作っておき、そのバッチファイルを管理者権限で実行してもフィルタが読み込まれないのは同様です。いったんコマンドプロンプトを管理者権限で実行しておくのがポイントのようです。

Vista では GraphEdit を使っても実行中の DirectShow アプリからグラフを取得できない

GraphEdit には "Connect to Remote Graph" という便利機能があり、グラフを作る時に ROT(Running Object Table) に突っ込んでおくと、アプリの実行中にその機能をつかって現在生成されているグラフを覗き見ることができるのですが、Vista ではこの機能が使えなくなってしまいました。
これを有効にするには、Windows SDK for Vista の C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin にある proppage.dll を regsvr32 で登録しておく必要があります。(ソース)

(C++Buidler2007 のみ)リンク時に「_CLSID_MediaDet が未解決」等のエラーが出る

DirectX 関係、また DirectShow においても大抵の GUID は、どこか 1 つのソースファイルで、該当する GUID が宣言されているヘッダをインクルードする前に #include を入れておけば、GUID の定義となって実体が作られるようになります。(ソース *1 ) が、DES(DirectShow 編集サービス) の CLSID については、唯一宣言されている qedit.h を見る限り、実体を定義する仕組みがないようです。
同じ箇所を VisualStudio(Windows SDK for Vista Ver.6) で確認すると、同様にヘッダに実体を定義する仕組みはない代わりに strmiids.lib をリンクするようになっています。ところがこの strmiids.lib が C++Builder2007 側にはありません。
そのため、C++Builder6 の時代から DirectX 関係を使う際にお世話になっている手段、Clootie graphics pages で配布されている CBuilder_DX92_libs.zipアーカイブに入っている strmiids.lib を使うことになります。現時点で収録されているのは DirectX 9.0 SDK Update(2007 April) 用とのことでバージョンの違いが心配されましたが、こちらでリンクして試した限りではDES も問題なく普通に動いています。
…ただ、個人的には DirectShow が Windows SDK(Platform SDK) に移って(つまり DirectX との縁が切れて)からこのライブラリが不要になるかと思っていただけに、もうしばらくお世話になる必要があるのはちょっと残念です…。orz

*1:もっとも、その方法は古い というページもあり、正直ようわかりません…。