Я создал фильтр push-кода, используя Delphi 6 Pro и библиотеку компонентов DSPACK DirectShow. Я хочу использовать фильтр в частном порядке, поэтому я не буду создавать AX-файл для DLL. Вместо этого я хочу создать фильтр напрямую. Я нашел несколько потоков по этому вопросу, но ни один из них не показывает, как создать частный фильтр с учетом конструктора фильтра:
constructor Create(ObjName: string; Unk: IUnKnown; out hr: HRESULT);
constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override;
Вот некоторые темы, которые я нашел на тему незарегистрированных или частных фильтров DirectShow:
http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm
http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54
Как напрямую встроить фильтр DirectShow Push Source в EXE-файл?
Исходный код фильтра был непосредственно добавлен в мой проект Delphi. Но я не знаю, какой конструктор мне следует использовать при создании фильтра непосредственно из моего основного приложения, и что передать параметрам конструктора. Может кто-нибудь сказать мне, какими они должны быть?
Кроме того, нужно ли мне увеличивать счетчик ссылок объекта Filter, как первый поток говорит сделать выше, а затем вызывать Release () для него позже, когда мое приложение завершает работу? Если так, каков наилучший способ сделать это? Или я могу просто позвонить в Free на фильтре, когда мое приложение завершает работу?
Наконец, мне нужно вызывать CoInitialized () и CoUninitialize () перед использованием моего частного фильтра?
ОБНОВЛЕНИЕ : Трассировка через классы и цепочку конструктора иерархии классов для TBCSource, базового класса для производных фильтров DSPACK, похоже, что параметр ObjName является именем фильтра и Unk параметр - объект, которому принадлежит фильтр. Мое текущее предположение состоит в том, что правильный способ создания фильтра непосредственно из источника был бы, учитывая производный класс TBCSource с именем TPushSourceFilter, который произвольно получает имя фильтра «Мой Push Source Filter», например, для целей:
TPushSourceFilter.Create('My Push Source Filter', nil, hr);
Первый параметр конструктора - это имя фильтра, которое используется для регистрации фильтра, то есть то, которое вы видите при просмотре фильтров DirectShow в таком инструменте, как GraphEdt. Я считаю, что вторым параметром должен быть NIL, поскольку он разрешается в owner поле данных (FOwner) в классе предков с именем TBCUnknown. Его единственная цель - перенаправить любые вызовы QueryInterface (), обрабатываемые базовым классом, на объект owner , если это не NIL, вместо применения запроса непосредственно к объекту Filter в случае, если это делегат ситуация. Я продолжу этот метод построения и посмотрю, работает ли он.