DSPACKコンポーネントライブラリを使用するDelphi6DirectShowアプリケーションの「古い」インターフェイス参照が原因で長いデバッグセッションが発生しました。ご存知のように、フィルターグラフがアクティブなときに実行する必要のある操作と、フィルターグラフを非アクティブにする必要があるときにコンポーネントパラメーターに対して実行する必要のある操作があります。問題は、初期化された値(NILではなく割り当てられた)を保持しているが、フィルターグラフの前のインカネーション中に作成されたため、現在のフィルターグラフのインカネーションには無効なDirectShowインターフェイス参照になってしまう可能性があることです。これは、フィルターグラフのオンとオフを切り替えて、「ライブ」検出操作とオフライン構成操作を切り替えるときに、偶然に行うのはそれほど難しくありません。
たとえば、フィルターグラフを最初にアクティブ化したときに割り当てたIBaseFilter参照を、フィルターグラフを非アクティブ化および再アクティブ化した後に再利用しようとしたとします。インターフェース参照は、フィルターグラフの現在の化身ではなく、前の化身に属しているため、「古くなった」状態になりました。これにより、あらゆる種類の奇妙で直感的でないDirectShowエラーメッセージが表示されますが、実際にはインターフェイス参照が古くなっていることが原因です。
慣例によるか、フィルターグラフの存続期間に関連付けられたDirectShowスマートポインターなどの巧妙なソリューションによるかを問わず、これを防ぐ方法を誰かが思いついたことがありますか?それとも、インターフェース参照の使用に執拗に注意する唯一の解決策ですか?