Пример вызова (маршаллинга) ATL-интерфейсов с квартирами в виде потока ATL из рабочего потока. - PullRequest
2 голосов
/ 24 марта 2011

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

Подробнее:

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

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

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

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

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

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

1 Ответ

2 голосов
/ 24 марта 2011

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

...