【问题标题】:CoCreateInstance hangs when called from OnThreadCreate从 OnThreadCreate 调用 CoCreateInstance 时挂起
【发布时间】:2021-07-07 07:05:32
【问题描述】:

我遇到了 CoCreateInstance 的问题,它在被调用后永远不会返回。它从 CSourceStream::OnThreadCreate 的重写方法调用

我认为问题在于我尝试在单独的线程中使用 COM,但我不确定。如何在另一个线程中使用 COM?这是调用堆栈以及无论如何我如何调用该函数。我检查了 CoInitialiseEx 返回 S_FALSE,所以 com 正在那个线程上运行。

HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
        CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pGraph));

我发现如果我在另一个运行在同一线程上的方法(CSourceStream::FillBuffer)中使用 CoCreateInstance,它可以工作,但我不知道为什么。

当 CoCreateInstance 挂起时,它会卡在 WaitForMultipleObjectsEx 上,如下所示:

【问题讨论】:

  • 我的水晶球说你没有在那个帖子上打电话给CoInitializeEx
  • 不要粗鲁,但你读过我的问题吗?我确实调用了 CoInitializeEx,它返回 S_FALSE -(来自 msdn S_FALSE = COM 库已在此线程上初始化。)。
  • 这本身可能不是 COM 问题。仔细阅读 Filter Graph Manager 的文档,docs.microsoft.com/en-us/windows/win32/directshow/… 它有一些线程细节。 COM 正在运行,但可能不是应有的方式。
  • 感谢修复

标签: c++ multithreading com directshow virtual-webcam


【解决方案1】:

正如 Simon 在 cmets 中所说,将 CLSID_FilterGraph 更改为 CLSID_FilterGraphNoThread 消除了僵局。

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多