У меня странная проблема при разработке приложения DirectShow.Я использую Delphi 6 с библиотекой компонентов DSPACK DirectShow.Один из экземпляров IBaseFilter, похоже, не распознает принадлежащий ему вывод, когда я пытаюсь найти вывод в фильтре, используя его свойство TPinInfo.achName (_PinInfo).(Обратите внимание, что в этом случае IBaseFilter, созданный компонентом TSampleGrabber, демонстрирует это странное поведение).
Последовательность событий, инкапсулированная в приведенном ниже примере кода, такова:
- Найдите первый доступный входной контакт в экземпляре IBaseFilter.В приведенном ниже коде это пин, переданный в testPinInfo ().
- Выполните QueryPinInfo () на возвращенном пин для получения этой информации.В возвращенной информации отображается значение achName контакта как «Input».
- Попробуйте найти контакт с именем «Input» в том же экземпляре IBaseFilter, используя IBaseFilter.findPin ().
- Получить 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;