DirectShow アプリケーションの開発中に奇妙な問題が発生しました。DSPACK DirectShow コンポーネント ライブラリで Delphi 6 を使用しています。IBaseFilter インスタンスの 1 つは、TPinInfo.achName プロパティ (_PinInfo) を使用してフィルター内のピンを見つけようとすると、所有するピンを認識しないようです。(この場合、この奇妙な動作を示しているのは、TSampleGrabber コンポーネントによって作成された IBaseFilter であることに注意してください)。
以下のコードサンプルにカプセル化された一連のイベントは次のとおりです。
- IBaseFilter インスタンスで最初に使用可能な入力ピンを見つけます。以下のコードでは、これは testPinInfo() に渡されるピンです。
- 返されたピンで QueryPinInfo() を実行して、その情報を取得します。返された情報は、ピンの achName を「入力」として示しています。
- IBaseFilter.findPin() を使用して、まったく同じ IBaseFilter インスタンスで「入力」という名前のピンを検索してみてください。
- その名前のピンが見つからなかったことを示す NIL を返します。私の意見では、これは本当に奇妙な状態 (エラー) です。
このシナリオを引き起こす可能性のある条件を知っている人はいますか? 関連するデータ構造は、デバッガーで調べると問題ないように見えるため、メモリ破損の問題ではないと思います。一部の IBaseFilter 実装が FindPin() メソッドの適切な実装を怠っている可能性はありますか?
以下にコードを示します。
procedure testPinInfo(intfInputPin: IPin);
var
intfTestPin: IPin;
pinInfo_input: TPinInfo;
begin
intfTestPin := nil;
// Get the pin information.
ZeroMemory(@pinInfo_input, SizeOf(pinInfo_input));
intfInputPin.QueryPinInfo(pinInfo_input);
// Now immediately turn around and try to find the pin in the filter that
// owns it, using the name found in pinInfo_input
pinInfo_input.pFilter.FindPin(pinInfo_input.achName, intfTestPin);
// >>> intfTestPin is NIL (unassigned). This is an error.
end;