Нужен ли уникальный идентификатор класса для каждого экземпляра фильтра DirectShow, если фильтр содержит постоянные локальные данные?
Я написал фильтр с исходным кодом, который я использую в частном порядке в своем приложении Delphi 6. Приложение использует библиотеку компонентов DSPACK DirectShow. Под приватностью я подразумеваю, что я просто добавляю экземпляры фильтра непосредственно в мой график фильтра, а не в фильтр, находящийся во внешней DLL (файл.ax).
Должен ли я создать уникальный идентификатор класса (GUID) для каждого экземпляра создаваемого фильтра или безопасно использовать один и тот же идентификатор класса для всех созданных экземпляров? Я обеспокоен этим, потому что каждый экземпляр фильтра создает локальный объект хранения данных для хранения данных, поставленных в очередь для фильтра. Локальный объект хранения данных записывается другим кодом внутри хост-приложения, таким образом, помещая данные в граф фильтра через мой фильтр push-кода.
Сейчас я не достаточно о DirectShow, чтобы знать, как осуществляется поиск указателей на методы, чтобы знать, безопасен ли мой дизайн. Когда я добавляю экземпляр фильтра непосредственно в граф, сохраняет ли DirectShow интерфейсные методы, которые граф фильтра будет вызывать по ссылке на объект или по идентификатору класса? Если это первое, тогда все будет хорошо, но если второе, то это может быть проблемой, если один и тот же экземпляр получает все вызовы метода. Кто-нибудь знает ответ на этот вопрос дизайна?
1 ответ
Идентификатор класса специфичен для класса, а не для экземпляра класса. Ваш класс фильтра должен иметь свой собственный уникальный идентификатор, и все экземпляры класса будут совместно использовать его во время выполнения. Если вы копируете код из другого проекта, вам необходимо убедиться, что вы заменили все существующие идентификаторы CLSID, IID, LIBID на новые, сгенерированные.