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

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

Больше деталей:

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

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

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

И мой компонент, и хост-приложение являются квартирами с резьбой.

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

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

1 ответ

Решение

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

Другие вопросы по тегам