我正在开发一个完全单线程的 Windows 程序,对任何数据结构都没有保护。但是,该程序使用 DirectShow API 打开自己的内部消息调度,例如 IVideoWindow::put_Visible。因此调用 IVideoWindow::put_Visible 方法的事件处理函数给了其他事件处理函数破坏其数据的机会。
有没有办法防止在 API 中发送这种消息?
我正在开发一个完全单线程的 Windows 程序,对任何数据结构都没有保护。但是,该程序使用 DirectShow API 打开自己的内部消息调度,例如 IVideoWindow::put_Visible。因此调用 IVideoWindow::put_Visible 方法的事件处理函数给了其他事件处理函数破坏其数据的机会。
有没有办法防止在 API 中发送这种消息?
这个问题对我来说有点不清楚。您是在谈论在内部进入模式消息循环的 API 吗?这是否会给您带来某种重入问题?如果是这种情况,那么可能有更好的方法来解决您的问题。如果 API 进入模态循环,那么毫无疑问是有充分理由的,您应该允许它这样做。(在您的情况下,我猜 DirectShow 在内部与另一个 COM 对象进行通信。)如果编写得当,模态循环仍会将消息发送到同一线程上的其他窗口。
无论如何,如果您真的想这样做,请按以下步骤操作:
PostQuitMessage( 0 ); // Signal quit to force the upcoming loop to exit
APIFunc(); // Enters modal loop internally
MSG msg;
PeekMessage( &msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE ); // Eat the next WM_QUIT
最后一步很重要。当模态循环由于 WM_QUIT 消息而退出时,它必须在退出后发布自己的退出消息(以便应用程序知道退出)。如果你不吃它,你的应用程序将退出。