Com 使用OleCreatePropertyFrame后,Conit_多线程神秘崩溃

Com 使用OleCreatePropertyFrame后,Conit_多线程神秘崩溃,com,directshow,Com,Directshow,在DirectShow应用程序中使用Conit_多线程有什么好处吗?现在它给了我一些麻烦,但我不确定使用coinitializex(NULL,COINIT_APARTMENTTHREADED)是否是解决这些问题的正确方法 完整故事: 我有一个非常简单的网络摄像头捕获应用程序,可以选择捕获源并通过OleCreatePropertyFrame调用设备制造商设置 我的应用程序运行非常稳定,没有内存泄漏,我可以在设备之间切换,没有任何问题(每次用户选择设备时,我都会完全重建DirectShow图形) 但

在DirectShow应用程序中使用Conit_多线程有什么好处吗?现在它给了我一些麻烦,但我不确定使用coinitializex(NULL,COINIT_APARTMENTTHREADED)是否是解决这些问题的正确方法

完整故事: 我有一个非常简单的网络摄像头捕获应用程序,可以选择捕获源并通过OleCreatePropertyFrame调用设备制造商设置

我的应用程序运行非常稳定,没有内存泄漏,我可以在设备之间切换,没有任何问题(每次用户选择设备时,我都会完全重建DirectShow图形)

但是在显示捕获过滤器的属性页之后,只有一个问题。如果我只是显示它并关闭而不做任何更改,所有操作都会正常进行。如果我更改属性页中的任何设置,然后关闭属性框,那么一切看起来也会正常。。直到下一次我更换设备并重建图形。前一个图形正常销毁,没有错误,过滤器被删除并正确释放。就在我创建一个新的图形并调用graphBuilder->SetFiltergraph(pfg)时,我的应用程序在内核32的IDE中出现了一些奇怪的访问冲突错误。但是,如果我将Conit_MULTITHREADED更改为Conit_APARTMENTTHREADED,这个错误就会消失


那么,Conit_多线程是我的应用程序的一个真正问题,还是可能有其他怪物隐藏在哪里?有人对此有经验吗?

任何创建窗口的线程都必须是STA。user32和gdi从根本上说都是线程不安全的。

STA是单线程单元的首字母缩写。这里是使用Windows COM单线程单元的起点。