2

Delphi 6 Pro と DSPACK DirectShow コンポーネント ライブラリを使用してプッシュ ソース フィルタを作成しました。フィルターをプライベートに使用したいので、DLL 用の AX ファイルを作成しません。代わりに、フィルターを直接作成したいと思います。これについていくつかのスレッドを見つけましたが、どちらもフィルターのコンストラクターを指定してプライベートフィルターを作成する方法を示していません。

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

以下は、未登録または非公開の DirectShow フィルターに関するスレッドです。

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

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

DirectShow Push Source フィルタを EXE に直接埋め込むにはどうすればよいですか?

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

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

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

UPDATE : DSPACK 派生フィルターの基本クラスである TBCSource のクラスとクラス階層コンストラクター チェーンをトレースすると、ObjNameパラメーターがフィルター名であり、Unkパラメーターがフィルターを所有するオブジェクトであることがわかります。私の現在の推測では、フィルターをソースから直接作成する正しい方法は、TPushSourceFilter という名前の TBCSource 派生クラスに、任意にフィルター名 'My Push Source Filter' が与えられた場合です。たとえば、次のようになります。

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

最初のコンストラクター パラメーターは、フィルターの登録に使用されるフィルター名です。つまり、GraphEdt などのツールで DirectShow フィルターを参照するときに表示される名前です。2 番目のパラメーターは、TBCUnknown という名前の祖先クラスの所有者データ フィールド (FOwner) に解決されるため、NIL にする必要があると思います。唯一の目的は、デリゲートの状況の場合にクエリを Filter オブジェクトに直接適用するのではなく、非 NIL の場合、基本クラスによって処理される QueryInterface() 呼び出しを所有者オブジェクトにリダイレクトすることです。この構築方法を進めて、うまくいくかどうかを確認します。

4

1 に答える 1

1

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

于 2011-10-28T06:06:08.577 に答える