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

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

Подробнее:

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

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

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

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

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

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


person Justin Grant    schedule 23.03.2011    source источник


Ответы (1)


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

person Hans Passant    schedule 23.03.2011