DirectShow の勉強をしよう

DirectShow 開発のイロハを解説したいいブログを教わりました。
imageryBlog http://www.firefly-vj.net/imagery/index.php?catid=8



http://www.firefly-vj.net/imagery/?itemid=183
http://www.firefly-vj.net/imagery/?itemid=186
この記事にしたがって、まずは「何もしない」サンプルを作ります。

コピペしてしまえば早いですが、ここははやる心を鎮めてあえてウェブサイトを見ながら手でソースを打ち込みます。
意味などわからなくていい、むしろ意味がわからないこそソースを手で打つ。30年前のBASIC小僧*1に返ったつもりで。

当然打ち間違いします。エラーが出ます。エラーの意味と対策を考えるのが勉強です。


今回はこれに悩まされた。

1>DllSetup.cpp
1>C:\SDKSamples\Multimedia\DirectShow\BaseClasses\wxutil.h(370) : warning C4793: '__asm' : 関数 'void *memchrInternal(const void *,int,size_t)' 用にネイティブ コードの生成が発生します
1>        C:\SDKSamples\Multimedia\DirectShow\BaseClasses\wxutil.h(365) : 'memchrInternal' の宣言を確認してください。
1>c:\Documents and Settings\asa\My Documents\Visual Studio 2005\Projects\SampleFilter\SampleFilter\DllSetup.cpp : warning C4747: マネージ '_DllMain@12' を呼び出します: マネージ コードは、DLL エントリポイントおよび DLL エントリポイントから到達した呼び出しを含むローダー ロック下では実行できません
1>リンクしています...
1>strmbasd.lib(source.obj) : warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます。

dll はできてるのですが、regsvr32 で DirectShow フィルタとして登録すると「R6033」エラーが起きてダメ。
DirectShow フィルタはネイティブコードであるべきなのに、なぜかマネージコードになっているから。
ネイティブってのはx86マシンコードで、マネージコードは.NET環境で走るバーチャルマシンコードですな


さあて困った。コンパイルオプションの問題のはずなのだけど、どういうわけか stdafx.h に #pragma unmanaged を加えてマネージコードを禁止してもうまくいかない。


BASIC小僧、困ったときはどうするか。解説を読み直して一からやり直します。
そういえば、プロジェクトを作るとき MFC DLL で始めたなあ。解説には Win32プロジェクト で作って、アプリケーションの種類として DLL を選べとある。
さすがにめんどいのでソースコードそのものはコピペ。


通った。


コマンドラインみながらいじくりまわしてるうちに、元のプロジェクトの方も通ったり通らなかったりしました。
#pragma unmanaged より、Microsoft SDK の Include や Lib をサーチパスに加えたのが敗因? BaseClasses だけでいいようです。
元プロジェクト自体はそこを直してもいまひとつ不安定なんですが、新プロジェクトの方は安定してます。


よくわからんが良し! 先へ進もう。

(追記)
ソースの中で、ときどき _ が空白に化けている箇所があるようです。
適宜自分で修正しながら進めましょう。

(訂正)
_ を空白と思ってしまったのは、目視で打ち込んだせいらしい。普通にコピペすればちゃんと _ あります。お騒がせしました。

*1:カセットテープにセーブしたゲームをロードしてランすることしかできないユーザーをロードランナー、なんて揶揄した時代もありましたが、その前に雑誌のゲームプログラムを打ち込むだけだからセーブ、ロード、リスト、ラン、「西部労働レストラン」なんてことを言ったのを妙に記憶しています