我在开发 DirectShow 应用程序时遇到了一个奇怪的问题。我正在使用带有 DSPACK DirectShow 组件库的 Delphi 6。当我尝试使用它的 TPinInfo.achName 属性 (_PinInfo) 在过滤器中查找引脚时,其中一个 IBaseFilter 实例似乎无法识别它拥有的引脚。(注意,在这种情况下,是由 TSampleGrabber 组件创建的 IBaseFilter 表现出这种奇怪的行为)。
事件序列,封装在下面的代码示例中是这样的:
- 在 IBaseFilter 实例中找到第一个可用的输入引脚。在下面的代码中,这是传递给 testPinInfo() 的引脚。
- 对返回的 pin 执行 QueryPinInfo() 以获取该信息。返回的信息将引脚的 achName 显示为“输入”。
- 尝试使用 IBaseFilter.findPin() 在同一个 IBaseFilter 实例中找到一个名为“Input”的引脚。
- 返回 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;