Page 1 of 1

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

Posted: Mon 31 Jul, 2006 08:21
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’а только перенаправлять вызов в рабочий поток, пользуясь средствами межпроцессного/межпоточного взаимодействия. Я прав, или это у меня приступ мании преследования?

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

Posted: Mon 31 Jul, 2006 09:38
by HaRT
Centaur wrote:Я прав, или это у меня приступ мании преследования?
И то, и другое. :P