Почему мой вызов COM не выполняется при запуске в другом потоке? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть код, который я хочу запустить в фоновом потоке.

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 правильно доступным из второго потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...