Использование COM в плагинах

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 1 time

Использование COM в плагинах

Post by Centaur » Mon 31 Jul, 2006 08:21

Вот, товарищи, такой вопрос концептуального плана возник.

Иногда нужно в плагине использовать функции библиотеки COM. Но для этого нужно, чтобы каждый thread, из которого предполагается работать с COM, сначала вошёл в apartment. Apartment’ы бывают single-threaded (STA) и multithreaded (MTA). После того, как thread вошёл в apartment, поменять тип apartment’а нельзя — повторный вызов CoInitialize[Ex] вернёт ошибку RPC_E_CHANGED_MODE.

Насколько я понимаю, основной код FAR’а работает в одном потоке, и вызывает в нём функции, экспортируемые плагинами.

Из всего этого следует, что плагин, вызвавший в экспортируемой функции CoInitialize[Ex], потенциально может испортить жизнь другому аналогичному плагину, если тому понадобится другая threading model.

Таким образом, по-видимому, всякий плагин, использующий COM, должен при загрузке запускать отдельный thread и всю работу с COM делать из него, а в потоке FAR’а только перенаправлять вызов в рабочий поток, пользуясь средствами межпроцессного/межпоточного взаимодействия. Я прав, или это у меня приступ мании преследования?

User avatar
HaRT
Moderator
Posts: 8683
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 78 times
Been thanked: 145 times

Re: Использование COM в плагинах

Post by HaRT » Mon 31 Jul, 2006 09:38

Centaur wrote:Я прав, или это у меня приступ мании преследования?
И то, и другое. :P

Post Reply

Return to “Разработка плагинов”