У меня есть код, который я хочу запустить в фоновом потоке.
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));
}
Код всегда работает при запуске в основном потоке, но иногда дает сбой при запуске в фоновом потоке. Он получает E_FAILED от InvokeCommand ().
Мой основной поток работает как однопоточная квартира COM, и я также вызвал CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED) в фоновом потоке.
Я начинаю задумываться, не связана ли моя проблема с тем, что интерфейс COM, который я использую для контекстного меню, был создан в другом потоке. Правила здесь гласят:
https://docs.microsoft.com/en-us/windows/desktop/com/single-threaded-apartments
- Каждый объект должен жить только в одном потоке (в однопоточной квартире).
- Инициализировать библиотеку COM для каждого потока.
- Маршал все указатели на объекты при прохождении их между квартирами.
Итак, вопрос:
Как мне сделать мой CComPtr правильно доступным из второго потока?