我只是有一个很长的调试会话,这是由我的Delphi 6 DirectShow应用程序中使用DSPACK组件库的“陈旧”接口引用引起的。如您所知,当Filter Graph处于活动状态时需要执行一些操作,而当Filter Graph必须处于非活动状态时,需要对组件参数执行其他操作。问题是您最终可能仍然具有初始化值(已分配,而不是NIL)的DirectShow接口引用,但对当前的Filter Graph化身无效,因为它们是在过滤器图形的先前版本中创建的。在打开和关闭过滤器图表以在“实时”发现操作和离线配置操作之间切换时,这并不是一件容易的事。离线操作的一个示例是为其中一个DSPACK组件设置Moniker,以便在下次打开图形时创建具体过滤器实例。
例如,您可以拥有在第一次激活过滤器图时指定的IBaseFilter引用,您尝试在取消激活并重新激活过滤器图之后重新使用该引用。接口引用现在是“陈旧的”,因为它不属于Filter Graph的当前版本,而是属于前一个版本。这导致了各种奇怪和不直观的DirectShow错误消息,这些消息不是它们看起来的,但实际上是由于接口引用是陈旧的。
有没有人想出办法,无论是按惯例还是通过一些聪明的解决方案,如DirectShow智能指针与Filter Graph的生命周期相关联等,以防止这种情况发生?或者是唯一一个对接口引用的使用不懈的解决方案?
答案 0 :(得分:1)
作为过滤器开发人员,当过滤器收到某些处理请求并且过滤器已从图表中删除或更改其状态时,您会返回错误代码。
从应用程序方面,您可以控制实现任何类型的sychnronization以指示操作终止。例如,在停止/释放过滤器图之前,您可以设置终止标志(布尔变量),并且在某种处理回调中可能会延迟并且需要同步,您检查标志并且您知道何时是中止处理的时间由于未完成的终止请求。