好吧,我们开始吧:
我们将使用出来,与Windows SDK的船,因为它是免费和开源的样品的ezrgb24过滤器的例子。它也已经定义了这方面的接口。请参阅接口的iez.h文件,具体来说,我们将从该文件中注意到两件事情:
1)我们的GUID是fd5010a3-8ebe-11ce-8183-00aa00577da1 - 我们需要该代码2)我们公开了在ezrgb24.cpp文件中定义的get_IPEffect和put_IPEffect函数
因此,我们已经完成了这方面的所有工作,它为我们提供了一个好主意使我们自己的功能暴露。
在我们的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是相同的,我们暴露的功能匹配什么是过滤器的代码中定义(你可以在C++函数请求一个指针时使用[Out],在这种情况下请记住,ezrgb24中的REFTIME只是double类的另一个名称)。
这是所有你需要开始使用的接口。
例如,假设我用directshow.net创建了一个图形并制作了ezrgb24过滤器的实例(快速且肮脏 - 在用regsvr32.exe注册我编译过的ezrgb24的dll后,我只是在GraphEdit中查找了绰号,以这种方式添加它)。我打电话给我在图IEfilter
中使用的ezrgb24过滤器的实例。
我把它添加到我的图形和连接引脚如常。 那么我可以用我定义为接口类遵循在任何时候改变滤波器的性能,而无需重新启动图形或调出属性页:
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);
}
就是这样。我希望这可以帮助任何人寻找暴露和访问过滤器属性的完整画面!