Хорошо, мы идем:
Мы будем использовать пример фильтра ezrgb24, который получается из примеров, которые поставляются с Windows SDK, потому что он бесплатный и с открытым исходным кодом. Он также уже определил интерфейс на этой стороне. См. Файл iez.h для интерфейса, в частности отметим две вещи из этого файла:
1) Наш GUID - fd5010a3-8ebe-11ce-8183-00aa00577da1 - он нам понадобится для кода на стороне C #
2) мы представляем функции get_IPEffect и put_IPEffect, которые определены в файле ezrgb24.cpp
Таким образом, вся работа на этой стороне уже проделана для нас, и это дает нам хорошее представление о том, как сделать наши собственные функции доступными.
Теперь в нашей программе на C # мы создадим интерфейс, который адаптируется к этому:
using System;
using System.Runtime.InteropServices;
...
[ComImport,
System.Security.SuppressUnmanagedCodeSecurity,
Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IIPEffect
{
[PreserveSig]
void get_IPEffect([Out] out int effectNum, [Out] out double StartTime, [Out] out double Length);
[PreserveSig]
void put_IPEffect([In] int effectNum, [In] double StartTime, [In] double Length);
}
Обратите внимание, что Guid - то же самое, и наши открытые функции соответствуют тому, что определено в коде фильтра (вы можете просто использовать [Out], когда функция C ++ запрашивает указатель, в этом конкретном случае помните, что REFTIME в ezrgb24 просто другое название для двойного класса).
Это все, что вам нужно, чтобы начать использовать интерфейс.
Например, скажем, я создаю граф с directshow.net и создаю экземпляр фильтра ezrgb24 (быстро и грязно - после регистрации моей скомпилированной dll из ezrgb24 с помощью regsvr32.exe, я просто посмотрел моникер в GraphEdit и добавил это так). Я назвал экземпляр фильтра ezrgb24, который использовал в своем графике IEfilter
.
Я добавляю его на свой график и подключаю контакты как обычно.
Затем я могу использовать интерфейсный класс, который я определил следующим образом, в любой момент, чтобы изменить свойства фильтра, без необходимости перезапускать график или вызывать страницу свойств:
IIPEffect myIIPEffect = IEfilter as IIPEffect;
int myInt;
double myDouble1, myDouble2;
if (myIIPEffect != null) //the cast will break if you didn't use the right GUID in your interface
{
myIIPEffect.put_IPEffect(1002, 6, 7); //for this filter, look at resource.h for what the int should be, in this case 1002 is the emboss effect
myIIPEffect.get_IPEffect(out myInt, out myDouble1, out myDouble2);
}
И это все. Я надеюсь, что это поможет любому, кто ищет полную картину раскрытия и доступа к свойствам фильтра!