Com 使用程序和筛选器源代码公开directshow筛选器属性示例

Com 使用程序和筛选器源代码公开directshow筛选器属性示例,com,directshow,Com,Directshow,我试图找到一个例子,其中一个可以通过filter属性页控制的参数有一个公开的getter/setter,这样,在不加载属性页的情况下,filter属性就可以由生成图的父程序更改 windows sdk中的Ezrgb24有一个可用的属性页,但我不知道如何公开属性页中使用的函数,以便我的程序可以直接访问它们,而无需初始化属性页本身。我翻阅了Microsoft Directshow的编程书,看到它通过了YUVGray示例过滤器,并提到使用的颜色可以暴露出来,以便图形的父程序可以更改它们,但没有给出如何

我试图找到一个例子,其中一个可以通过filter属性页控制的参数有一个公开的getter/setter,这样,在不加载属性页的情况下,filter属性就可以由生成图的父程序更改

windows sdk中的Ezrgb24有一个可用的属性页,但我不知道如何公开属性页中使用的函数,以便我的程序可以直接访问它们,而无需初始化属性页本身。我翻阅了Microsoft Directshow的编程书,看到它通过了YUVGray示例过滤器,并提到使用的颜色可以暴露出来,以便图形的父程序可以更改它们,但没有给出如何更改的示例

同时,来自directshow.net的示例,如windows sdk示例,似乎只包含过滤器或程序源代码,我没有看到任何示例过滤器直接公开此类属性。但是像BitmapMixer这样的例子调用IVMRMixerBitmap9.SetAlphaBitmap,这是一个VMR9接口。我想要一个示例,它为我提供了一个类似接口和过滤器的代码,这样我就可以看到它们之间的关系,还有一个程序,这样我就可以看到应该如何设置我的环境以利用该接口

我猜这是利用COM的一个基本练习,但我真的希望有一个完整的示例,包含所有源代码,这样我就可以完全理解所有内容是如何连接的。即使暴露的属性被琐碎地使用,它也足以作为一个骨架继续下去。有没有这样一个我错过的例子?我在C++程序中使用了DuttStudio.NET,可以得到任何图形的设置和运行,所以C++程序就可以了。< /P> < P> 我们将使用windows sdk附带的示例中的ezrgb24过滤器示例,因为它是免费的、开源的。它也已经定义了这方面的接口。有关接口,请参见iez.h文件,具体来说,我们将从该文件中注意两件事:

1) 我们的GUID是fd5010a3-8ebe-11ce-8183-00aa00577da1-我们需要它来编写C端的代码 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中的ReFoT只是另一个类的名称)。 这就是开始使用该界面所需的全部内容

例如,假设我使用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);
}
就这样。我希望这有助于任何人寻找一个完整的图片公开和访问过滤器属性