Пример вызова (маршалинга) многоканальных COM-интерфейсов ATL из рабочего потока

StackOverflow https://stackoverflow.com/questions/5411927

Вопрос

Я ищу образец кода, который иллюстрирует выполнение многопоточных вызовов COM в DLL-библиотеке COM-сервера ATL. Знаете одного?

Подробнее:

Мой компонент - это вспомогательный объект браузера IE, который должен работать в фоновом потоке. В одном из моих методов объекта, вызываемых из основного потока IE, IE дает мне указатель на IE DOM ( IHtmlWindow2 ), и я сохраняю его в локальной переменной-члене.

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

Если это важно, мои вызовы будут происходить после того, как я вернусь из метода, в котором я получил указатель интерфейса из IE, поэтому IE (а не мой код) будет иметь контроль, когда я попытаюсь выполнить вызовы из моего рабочего потока.

И мой компонент, и хост-приложение являются многопоточными.

Кто-нибудь знает хороший пример C ++, показывающий, как это делается?

Я специально ищу короткий простой образец (а не просто указатель на соответствующую документацию), потому что я прочитал этот вопрос и ответы на него, и я был напуган объемом обучения, который мне пришлось бы сделать написать реализацию с нуля. Каждый раз, когда кто-то рекомендует прочитать книгу Дона Бокса перед написанием кода, знайте, что вас ждет долгая, запутанная ночь ... :-)

Это было полезно?

Решение

Это происходит автоматически в COM, оно учитывает требования квартиры и выполняет маршалинг вызова, если указатель интерфейса имеет сходство с STA.Вы должны маршалировать указатель интерфейса перед использованием его в потоке, ATL имеет вспомогательные методы AtlMarshalPtrInProc () и AtlUnmarshalPtr (), чтобы упростить это.CoMarshalInterThreadInterfaceInStream () или IGlobalInterfaceTable, если вы хотите сделать это самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top