2011-10-27 11 views
2

私は、Delphi 6 ProとDSPACK DirectShowコンポーネントライブラリを使用してプッシュソースフィルタを作成しました。フィルタを私的に使用したいので、DLLのAXファイルを作成しません。代わりにフィルターを直接作成したいと考えています。私はこの上でいくつかのスレッドを発見したが、それらのいずれも、フィルタのコンストラクタの与えられたプライベートフィルタを作成する方法を示しています。登録されていないDirectShowフィルタを適切に(ソースコードを使用して)構成するにはどうすればよいですか?

http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm:ここ

constructor Create(ObjName: string; Unk: IUnKnown; out hr: HRESULT); 
constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override; 

は私が未登録またはプライベートDirectShowフィルタの対象にあるいくつかのスレッドがあります

http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54

How can I directly embed a DirectShow Push Source filter in an EXE?

フィルタのソースコードがDelphiプロジェクトに直接追加されました。しかし、主なアプリケーションから直接フィルタを作成するときにどのコンストラクタを使うべきか、そしてコンストラクタのパラメータを渡すべきものはわかりません。誰かが何をすべきか教えてくれますか?

また、フィルタオブジェクトの参照カウントをインクリメントする必要がありますか?最初のスレッドで上記のようにしてから、アプリケーションが終了したときにRelease()を呼び出します。もしそうなら、これを行う最善の方法は何ですか?または、アプリケーションの終了時にフィルタで「無料」を呼び出すことはできますか?

最後に、プライベートフィルタを使用する前にCoInitialized()とCoUninitialize()を呼び出す必要がありますか?

UPDATE:TBCSource、DSPACK派生フィルタの基底クラスのためのクラスとクラス階層のコンストラクタチェーンを通じてトレース、OBJNAMEパラメータは、フィルター名で、UNKパラメータがオブジェクトであることが表示されますフィルタを所有する私の現在の推測は正しい方法は、例えば、目的のために、任意のフィルタ名「マイプッシュソースフィルタ」を与えていることTPushSourceFilterという名前TBCSource派生クラスを与えられるであろうソースから直接フィルタを作成することです:

TPushSourceFilter.Create('My Push Source Filter', nil, hr); 

最初のコンストラクタパラメータは、フィルタを登録するために使用されるフィルタ名です。つまり、DirectShowフィルタをGraphEdtのようなツールで表示するときに表示されるフィルタ名です。 2番目のパラメータは、先祖クラスTBCUnknownのオーナーデータフィールド(FOwner)に解決されるため、2番目のパラメータはNILである必要があります。 デリゲートの場合に、クエリをFilterオブジェクトに直接適用するのではなく、NIL以外の場合は、所有者オブジェクトにベースクラスで処理されたQueryInterface()呼び出しをリダイレクトすることが唯一の目的です。私はこの建設方法に進み、それが機能するかどうかを見ていきます。

答えて

1

オブジェクトのインスタンスは、TPushSourceFilter.Createであり、このインスタンスからはIBaseFilterインターフェイスを取得するだけです。そこから、CoCreateInstanceで作成したフィルタと同じようにグラフに追加してから、ピンなどを接続します。

関連する問題