我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 过滤器。它是一个推送源视频过滤器,它从我也编写的外部合作进程接收其源帧。
当创建并运行调用我的过滤器的 FillBuffer() 调用的工作线程时,当图形启动时,我从该工作线程做的第一件事是使用 AllocateHWND() 创建一个隐藏窗口来处理包含外部的 WM_COPYDATA 消息生成的帧。就在线程被销毁之前,我销毁了隐藏的窗口。换句话说,隐藏窗口是在调用 FillBuffer() 的工作线程的执行上下文中创建和销毁的。我的意图是让 FillBuffer() 在等待 WM_COPYDATA 或 WM_QUIT 消息时阻塞。外部合作进程将使用 WM_COPYDATA 消息和隐藏窗口的 WndProcc() 的句柄将帧提交给我的过滤器。我将在我对 pin 的 Inactive() 方法的覆盖中发布一条 WM_QUIT 消息(感谢@RomanR 的提示),
我的问题是,在这种情况下,从 FillBuffer() 调用中调用 PeekMessage() 或 GetMessage() 是否安全?或者,在 DirectShow 图形执行的上下文中是否存在由此发生的潜在缺陷?另外,您是否看到我需要考虑的整体方法中的任何缺陷?