为什么在另一个线程上运行时,我的COM调用失败?

时间:2018-09-05 07:51:19

标签: c++ windows com

我有一些要在后台线程上运行的代码。

bool CallThreadSafeInvokeCommand(std::unique_ptr<ShellInvokeCommandInfo> const pInvokeCommandInfo, CComPtr<IContextMenu> const pContextMenu)
{
    if (!pInvokeCommandInfo || !pContextMenu)
    {
        return false;
    }

    CMINVOKECOMMANDINFO* pici = *pInvokeCommandInfo;
    return SUCCEEDED(pContextMenu->InvokeCommand(pici));
}

当在主线程上运行时,代码始终有效,但是在后台线程上运行时,有时会失败。它来自InvokeCommand()的E_FAILED。

我的主线程作为单线程COM公寓运行,我在后台线程上也调用了CoInitializeEx(nullptr,COINIT_APARTMENTTHREADED)。

我开始怀疑我的问题是否与以下事实有关:我用于上下文菜单的COM接口是在其他线程上创建的。这里的规则说明:

https://docs.microsoft.com/en-us/windows/desktop/com/single-threaded-apartments

  • 每个对象应仅驻留在一个线程上(在单线程单元中)。
  • 为每个线程初始化COM库。
  • 在公寓之间传递对象时,将所有指向对象的指针编组。

那么问题:

如何从第二个线程正确访问CComPtr?

0 个答案:

没有答案
相关问题