DirectShow过滤器中的静态用法

时间:2011-11-16 09:05:47

标签: function variables static filter directshow

当我们创建一个directshow过滤器并注册它时,静态变量/函数在同一过滤器的多个实例中共享。我相信这也适用于其他ActiveX控件。例如,如果我尝试使用类似的东西;

static int counter = 0;

void someFunction() {
    counter++;
    // trace result here
}

如果我启动同一过滤器的另一个实例,则第二个实例不会从0开始,而是第一个实例计数器离开。然后他们开始异步增加同一个计数器。

我的问题是,是否有任何智能方法可以阻止DirectShow过滤器的静态变量之间的共享?这可能听起来很愚蠢但是如果我们使用不同的GUID注册相同的过滤器(通过使用不同的GUID和文件输出重新编译相同的项目),静态变量不再共享,因为它们是两个不同的过滤器,对吧?那么,有什么方法可以使用相同的过滤器来模拟这个,但保持静态?

我要做的是使用一个包含许多静态用法的库。摆脱所有静态变量/函数非常困难。我试图使用的库使用像Ansi C这样的旧标准,并且没有真正的面向对象设计。因此,封装不是很容易。大多数函数都在全局空间中,而不是在类中。请记住这一点。如果我按原样保留静态,过滤器的单个实例工作正常,但由于共享(静态)变量,其他实例开始变得混乱。

1 个答案:

答案 0 :(得分:0)

它实际上并不特定于DirectShow,问题是典型问题:我应该在我班级的多个实例中使用静态变量。

智能答案:如果您不想使用静态变量 - 请不要。过滤器的每个实例都是一个单独的类实例。使用它的成员变量,不要使用全局变量。

  

我要做的是使用具有许多静态用法的库   它。摆脱所有静态变量/函数非常困难。

将所有静力学放入一个大班,例如“state”并且每个过滤器都有一个单独的“状态”实例。这是非常首选的方式。

另一个解决方案是将所有静态转移到子DLL中并将其加载到进程外,以便每个实例由单独的进程托管。虽然从技术上来说这直接解决了你的问题 - 也就是说,在子进程中所有静态都保持静态,同时每个所有者过滤器拥有一个单独的副本,实现进程外DLL和进程间通信所需的知识基本上假设你可以设法成功实施上一段中提到的第一个“州”解决方案。