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() 呼び出しを所有者オブジェクトにリダイレクトすることです。この構築方法を進めて、うまくいくかどうかを確認します。