Пример 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, если вы хотите сделать это самостоятельно.