Как получить доступ к COM-объектам из разных моделей квартир? - PullRequest
3 голосов
/ 10 октября 2011

У меня есть многопоточное приложение с графическим интерфейсом C ++ Builder, которое взаимодействует со сторонним приложением через COM.

Мне нужно вызывать методы COM-объекта из нескольких потоков, и я защищаю доступ с помощью мьютекса. Очевидно, что основной поток GUI должен использовать модель STA, но мои рабочие потоки должны использовать MTA. COM-объект создается в потоке MTA.

Все работает нормально , за исключением доступа к COM-объекту из потока GUI, из-за несоответствия MTA / STA.

Я немного читал о маршаллинге, но не пытался его реализовать, потому что примеры, которые я видел, похоже, требуют различной семантики доступа в зависимости от текущей модели квартиры, и я действительно хотел бы иметь код (из POV программиста) не заботится о текущей модели квартиры.

Итак, есть ли идиоматический способ написания COM-кода, который работает с «тем же» объектом, но может вызываться как из потоков STA, так и из MTA?

1 Ответ

1 голос
/ 14 февраля 2015

Поместите интерфейс COM-объекта в Глобальную таблицу интерфейсов и позвольте GIT обработать сортировку для вас.Когда какой-либо поток запрашивает интерфейс COM, GIT проверяет вызывающую квартиру и соответственно предоставляет прямой указатель или подходящий прокси.Ваш код не будет знать разницу (или заботу), просто используйте возвращаемый интерфейс как обычно.

Это задокументировано в MSDN:

Доступ к интерфейсам в квартирах

...