我有一些要在后台线程上运行的代码。
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
那么问题:
如何从第二个线程正确访问CComPtr?