Как заставить метод COM-объекта выполняться не в основном потоке - PullRequest
4 голосов
/ 08 марта 2011

У меня есть служба Windows, которая реализует локальный сервер COM.

При запуске в качестве приложения методы COM-объекта вызываются в отдельном (не в основном) потоке, что просто отлично.Ситуация меняется при запуске в качестве службы - тогда методы COM-объекта вызываются в контексте потока службы, что мне не нравится.

Я вижу, что это связано с квартирами, MTA, STA и так далее.... но я не могу понять, как заставить COM вызывать методы моего объекта в отдельном потоке, а не в служебном.

Может быть, это как-то связано с регистрацией объекта com при запуске службы?

Моя среда - Windows 7 + Delphi, но решения на C ++ приветствуются.

Обновление 2011-04-26 :
Слава @sharptooth и @Chris Dicksonэто заставило меня искать решение в направлении «петель сообщений».

Поскольку это STA, приложение полагается на насос сообщений для доставки сообщений COM потоку, который зарегистрировал coclass.Я переместил регистрацию coclass в отдельный поток, в котором есть цикл сообщений, и теперь все вызовы com выполняются в этом потоке.Я пробовал этот подход раньше, но забыл о цикле сообщений, так что это был недостающий фрагмент головоломки.Спасибо, ребята!

1 Ответ

1 голос
/ 06 мая 2011

Объекты будут вызываться с любого потока, с которого вы их зарегистрировали. Если вы хотите, чтобы объекты вызывались в отдельной квартире (STA), вы должны зарегистрировать объекты класса из этой квартиры. Это может быть достигнуто путем создания отдельного потока и регистрации оттуда.

...