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

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

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

Post by Centaur »

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

Иногда нужно в плагине использовать функции библиотеки 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: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

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

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