2011-11-13 7 views
0

私はちょうどDSPACKコンポーネントライブラリを使用して、私のDelphi 6のDirectShowアプリケーションで、「古い」インターフェースの参照によって引き起こされた長いデバッグセッションを持っていました。あなたが知っているように、フィルタグラフがアクティブであるときに実行される必要がある操作と、フィルタグラフが非アクティブでなければならないときにコンポーネントパラメータに対して行われる操作があります。問題は、まだ初期化された値(割り当て済み、NILではありません)が、フィルタグラフの前回のインカネーション時に作成されたため、現在のフィルタグラフインカネーションでは有効ではないDirectShowインターフェイス参照で終わる可能性があることです。これは、偶発的に実行するのは難しいことではありませんが、フィルタグラフをオンまたはオフにして、「ライブ」検出操作とオフライン設定操作を切り替えることができます。オフライン操作の例は、次にグラフがオンになったときに具体的なフィルタインスタンスを作成するときに使用するDSPACKコンポーネントの1つのMonikerを設定することです。"古い" DirectShowインタフェースの参照から自動的に保護する方法はありますか?

たとえば、フィルタグラフを最初にアクティブにしたときに割り当てたIBaseFilter参照、フィルタグラフを非アクティブ化して再度アクティブにした後に再利用しようとした参照を持つことができます。インタフェース・リファレンスは、現在のフィルタ・グラフのインカネーションに属していないため、以前のものには属していないため、「古く」なっています。これは、奇妙で直観的ではないDirectShowエラーメッセージのすべてにつながりますが、実際にはインターフェイスリファレンスが古くなっているためです。

は、誰もが慣例により、またはこれを防ぐためのフィルタグラフの寿命に縛らDirectShowのスマートポインタなどのようないくつかの巧妙なソリューションによってかどうか、方法を考え出すていますか?あるいは、インターフェイス参照の使用について絶え間なく注意する唯一の解決策ですか?フィルタは、いくつかの処理要求を受信し、フィルタがすでにグラフから削除、またはその状態を変更したことが表示されたら、あなたはエラーコードを返すフィルタの開発者として

答えて

1

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

関連する問題