0

DSPACKコンポーネントライブラリを使用するDelphi6DirectShowアプリケーションの「古い」インターフェイス参照が原因で長いデバッグセッションが発生しました。ご存知のように、フィルターグラフがアクティブなときに実行する必要のある操作と、フィルターグラフを非アクティブにする必要があるときにコンポーネントパラメーターに対して実行する必要のある操作があります。問題は、初期化された値(NILではなく割り当てられた)を保持しているが、フィルターグラフの前のインカネーション中に作成されたため、現在のフィルターグラフのインカネーションには無効なDirectShowインターフェイス参照になってしまう可能性があることです。これは、フィルターグラフのオンとオフを切り替えて、「ライブ」検出操作とオフライン構成操作を切り替えるときに、偶然に行うのはそれほど難しくありません。

たとえば、フィルターグラフを最初にアクティブ化したときに割り当てたIBaseFilter参照を、フィルターグラフを非アクティブ化および再アクティブ化した後に再利用しようとしたとします。インターフェース参照は、フィルターグラフの現在の化身ではなく、前の化身に属しているため、「古くなった」状態になりました。これにより、あらゆる種類の奇妙で直感的でないDirectShowエラーメッセージが表示されますが、実際にはインターフェイス参照が古くなっていることが原因です。

慣例によるか、フィルターグラフの存続期間に関連付けられたDirectShowスマートポインターなどの巧妙なソリューションによるかを問わず、これを防ぐ方法を誰かが思いついたことがありますか?それとも、インターフェース参照の使用に執拗に注意する唯一の解決策ですか?

4

1 に答える 1

1

フィルター開発者は、フィルターが何らかの処理要求を受け取り、フィルターが既にグラフから削除されているか、状態が変更されているように見える場合に、エラー コードを返します。

アプリケーション側からは、操作の終了を示すためにあらゆる種類の同期を実装できます。たとえば、フィルター グラフを停止/解放する前に、終了フラグ (ブール変数) を設定できます。また、遅れて同期が必要な処理コールバックの一種で、フラグをチェックすると、いつ処理を中止するかがわかります。未解決の終了要求のため。

于 2011-11-14T09:28:26.400 に答える