我刚刚有一个很长的调试会话,这是由使用 DSPACK 组件库的 Delphi 6 DirectShow 应用程序中的“陈旧”接口引用引起的。如您所知,当过滤器图处于活动状态时需要执行一些操作,而当过滤器图必须处于非活动状态时,需要对组件参数执行其他操作。问题是您最终可能会得到仍然具有初始化值(已分配,而不是 NIL)的 DirectShow 接口引用,但对于当前的 Filter Graph 化身无效,因为它们是在 Filter Graph 的先前化身期间创建的。在打开和关闭过滤器图以在“实时”发现操作和离线配置操作之间切换时,这并不难做到。
例如,您可能有一个 IBaseFilter 引用,该引用是您在第一次激活过滤器图时分配的,您在停用和重新激活过滤器图后尝试重新使用该引用。接口引用现在是“陈旧的”,因为它不属于 Filter Graph 的当前化身,而是属于以前的化身。这会导致各种奇怪且不直观的 DirectShow 错误消息,这些错误消息并不是它们看起来的那样,但实际上是由于接口引用过时造成的。
有没有人想出一种方法,无论是通过约定还是通过一些聪明的解决方案,例如与过滤器图的生命周期相关的 DirectShow 智能指针等,以防止这种情况发生?或者是唯一对接口引用使用保持谨慎的解决方案?