Нужен ли мне уникальный идентификатор класса для каждого экземпляра DirectShow filter, если фильтр имеет постоянные локальные данные?

#delphi #guid #directshow #dspack

#delphi #guid #directshow #dspack

Вопрос:

Я написал фильтр push-источника, который я использую в частном порядке в своем приложении Delphi 6. Приложение использует библиотеку компонентов DirectShow DSPACK. Под частным я подразумеваю, что я просто добавляю экземпляры фильтра непосредственно в мой график фильтров, вместо фильтра, находящегося во внешней DLL (.ax-файл).

Должен ли я создавать уникальный идентификатор класса (GUID) для каждого экземпляра создаваемого мной фильтра или безопасно использовать один и тот же идентификатор класса для всех созданных экземпляров? Меня это беспокоит, потому что каждый экземпляр фильтра создает объект локального хранилища данных для хранения данных, поставленных в очередь для фильтра. Объект локального хранилища данных записывается другим кодом в главном приложении, тем самым помещая данные в график фильтра через мой фильтр push source .

Я недостаточно разбираюсь в DirectShow, чтобы знать, как выполняется поиск указателей методов, чтобы узнать, безопасен ли мой дизайн. Когда я добавляю экземпляр фильтра непосредственно в граф, сохраняет ли DirectShow указатели на методы интерфейса, которые граф фильтра будет вызывать по ссылке на объект или по идентификатору класса? Если это первое, тогда все будет хорошо, но если это последнее, то это может быть проблемой, если один и тот же экземпляр получает все вызовы методов. Кто-нибудь знает ответ на этот вопрос о дизайне?

Ответ №1:

Идентификатор класса относится к классу, а не к экземпляру класса. Ваш класс фильтра должен иметь свой собственный уникальный идентификатор, и все экземпляры класса будут использовать его во время выполнения. Если вы копируете код из другого проекта, вам нужно убедиться, что вы заменили все существующие идентификаторы CLSID, IID, LIBID на новые сгенерированные.

Комментарии:

1. Да, спасибо, я это знал. Но если я добавлю несколько экземпляров моего класса Filter в один и тот же граф фильтров, будет ли первый созданный мной экземпляр в конечном итоге получать все вызовы DX (FillBuffer(), DecideBufferSize() и т. Д.), Или граф фильтров перенаправит эти вызовы на правильный экземпляр класса на основе pin-кодасоединения?

2. Как только фильтры создаются и отображаются на графике, они CLSID используются только для целей сохранения (только если дело доходит до сохранения состояния!), Поэтому они должны предоставлять то же CLSID самое. График различает fitlers по их указателям на интерфейс, а также присваивает им уникальные имена.