DirectShowのRenderer作成

解決


うま  2005-05-17 18:38:14  No: 57417

VC++2003/WindowsXP/DirectX9.0cSDK環境で、DirectShowでAVI表示、画像を加工するフィルターを通して画面出力、という処理を行いたいと思います。

http://www.greenwood.co.jp/~k-aki/pc/directshow_movie/directshow_movie.html
こちらのサイトの 「6 Rendererを作る」のソースを参考に・・・というか GrabRenderer.h と GrabRenderer.cpp をほぼそのまま貼り付けてコンパイルしてみたのですが、以下のリンクで以下のエラーが発生し、これが解決できません。
strmbasd.lib へのリンクはちゃんと通っているようなのですが、他に何をすればよいのか、教えていただけないでしょうか?

error LNK2001: 外部シンボル ""public: virtual long __stdcall CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAGJPAPA_W@Z)" は未解決です。
error LNK2001: 外部シンボル ""public: virtual long __stdcall CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAGJPAUIFilterGraph@@PB_W@Z)" は未解決です。
error LNK2001: 外部シンボル ""public: virtual long __stdcall CTransformFilter::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CTransformFilter@@UAGJPB_WPAPAUIPin@@@Z)" は未解決です。

よろしくお願いします。


なべ  2005-05-17 20:37:56  No: 57418

Visual Studio 2002のVC++でActiveXを作成し、VBから利用しようとしています。
コントロールにメソッドを追加したのですが、VBから参照可能になりません。
idlファイルにメソッドの定義が追加されていないので、
このためだと思うのですが、正しい手順が判らず困っています。

〜〜〜今の手順〜〜〜
① [ファイル]→[新規作成]→[プロジェクト]→MFC ActiveXコントロール でXXXプロジェクトを作成
② クラスビューを表示し、ツリービューのCXXXCtrlクラスを右クリックしてメソッドを追加
〜〜〜〜〜〜〜〜〜〜

MSDNライブラリの以下の説明に従っているつもりなのですが...。

http://www.microsoft.com/japan/msdn/library/ja/vccore/html/_core_activex_controls.3a_.adding_custom_methods_to_an_activex_control.asp?frame=true

右クリックのショートカットメニューの[追加]からは、
[メソッドの追加]ではなく[関数の追加]と表示されます。
また、[関数の追加]を選択した時に表示されるダイアログも
「メソッド追加ウィザード」ではなく「メンバ関数の追加ウィザード」ですし、
内容も微妙に違うようです(「内部名」というテキストボックスはない)。

ちなみに、VC++6.0でプロジェクトをMFC ActiveX Control Wizardで作成し、
ClassWizardでメソッドを追加した時には、odlファイルに宣言が追加され、
VBからも参照・呼び出しが可能になっていました。

初歩的な手順の問題とは思いますが、ご助言お願いします。


なべ  2005-05-17 20:41:00  No: 57419

新規の質問なのに、
うま さんへの返信で書き込んでしまいました。
大変失礼致しました。

新規で書き込ませて頂きますので、管理人様、
この書き込みも含めて削除して頂けますでしょうか。

申し訳ありません。


ボコノン教徒  2005-05-18 18:28:20  No: 57420

>strmbasd.lib へのリンクはちゃんと通っているようなのですが

これはDirectX9.0cSDKの中で自力でビルドしたやつですよね?
strmbasd.libはデバッグビルド用なんだけど、
リリース用のstrmbase.libだとどうなる?


うま  2005-05-19 02:37:43  No: 57421

>ボコノン教徒さん
回答ありがとうございます。
strmbase.lib もリンクしてみましたが、同様にリンクでエラーが発生します。
エラーメッセージも同様です。
私のマシン以外でも同様のエラーを確認したので、DirectX9.0c+VS2003の問題のような気がしているのですが・・・

ISampleGrabberCBクラスを派生したフィルタは構築できたのですが、CTransformFilter / CBaseVideoRenderer クラスを利用しようとすると、コンストラクタがコールされるところでこの例外が発生します。
DirectShowについてくるサンプルのEZRGB24等はこの例外が発生しません。

.vcprojファイルもいじってみたりはしているのですが、どうにも原因がわかりません。
よろしくお願いします。


ボコノン教徒  2005-05-19 19:10:55  No: 57422

>DirectShowについてくるサンプルのEZRGB24等はこの例外が発生しません。

これは、自前でビルドしたのでしょうか。

以下、念のため。
SDK付属のサンプルをそのまま(サンプルのディレクトリツリーの中で)
ビルド・実行できますか?
事前にBaseClassesでビルドする必要があります。

> CTransformFilter / CBaseVideoRenderer クラスを利用しようとすると、
> コンストラクタがコールされるところでこの例外が発生します。

VS2003のパスにあるIncludeファイル内のCTransformFilter / CBaseVideoRendererの定義とstrmbase.lib を作成した際に使ったIncludeファイルのクラス定義が食い違っているようです。
別途、DirectX SDKを使う場合、VS2003のLibの中にあるstrmbase.libは使えない、と考えていいです。


うま  2005-05-20 02:26:43  No: 57423

回答ありがとうございます。
先ほどCドライブ全スキャンしたところ、strmbase.libが出るわ出るわ。
いくつかパス内のファイルは確認していたのですが、
違うものにリンクされていたようです。

ファイルを全部統一したところ、ようやくビルドが通りました。
どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加