使用OleCreatePropertyFrame后,COINIT_MULTITHREADED和神秘的崩溃

时间:2010-08-23 13:59:37

标签: com directshow

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

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

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

但是显示捕获过滤器的属性页后只有一个问题。如果我只是展示并关闭而不改变任何东西,一切都会继续正常。如果我更改属性页中的任何设置然后关闭属性框,那么一切看起来都很正常..直到下次我更改设备并重建图形。上一个图表被正常销毁,没有错误,过滤器被正确删除和释放。当我创建一个新图并调用graphBuilder-> SetFiltergraph(pfg)时,我的应用程序崩溃了Kernel32的一些奇怪的访问冲突错误。但如果我将COINIT_MULTITHREADED更改为COINIT_APARTMENTTHREADED,则此错误消失。

那COINIT_MULTITHREADED是我的应用程序的真正问题,或者还有其他一些怪物隐藏在哪里?有人有经验吗?

1 个答案:

答案 0 :(得分:3)

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