Проблема ссылки на фильтр DirectShow из C # - PullRequest
1 голос
/ 10 мая 2010

У меня есть специальный фильтр DirectShow, созданный путем расширения фильтра ezrgb24 из образца документации DirectShow.

Я использую этот фильтр (косвенно) в C # через сторонний мультимедийный SDK (LeadTools). Теперь мне нужно добавить ссылку на DLL-файл фильтра в проект, чтобы я мог преобразовать интерфейс IUnknown, полученный SDK, в собственный пользовательский интерфейс фильтра.

Я попытался добавить ссылку на DLL через add reference -> browse и с помощью tlbimp непосредственно в командной строке. Оба подхода приводят к ошибке «C: \ windows \ system32 \ ezrgb24.dll» не является допустимой библиотекой типов.

Я что-то упустил? Расширения, которые я сделал для примера ezrgb24, структурно довольно тривиальны, по сути, если у кого-то есть примеры DirectShow, они точно знают код, с которым я работаю.

Любая помощь очень ценится.

Tony.

Ответы [ 2 ]

2 голосов
/ 11 мая 2010

Вам нужно написать интерфейс на C # и использовать атрибут ComImport. Например, пример фильтра из SDK будет выглядеть

[ComImport,
InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1")] //guid defined for interface in example code
public interface IIPEffect
{
  [PreserveSig]
  int get_IPEffect(out int effectTime, out double startTime, out double length);

  [PreserveSig]
  int set_IPEffect(int effectNum, double startTime, double length);
}

Теперь вы можете использовать определение интерфейса таким способом

//find IBaseFilter somehow
var effectFilter = FindFilter() as IIPEffect;
effectFilter.set_IPEffect(0, 0, 20);

ПРИМЕЧАНИЕ : в определении интерфейса есть тип REFTIME как параметр для длины и startTime, но это просто typedef, и поэтому в нашем коде это double. Для получения дополнительной информации о преобразовании определения интерфейса в C # вы можете прочитать статью marshaling на msdn

1 голос
/ 10 мая 2010

Стандартные образцы фильтра DirectShow не реализуют интерфейсы, совместимые с IDispatch. Кроме того, в этих библиотеках нет библиотек типов. Вы должны реализовать свой собственный интерфейс библиотеки типов.

Вы можете использовать ATL для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...