Вот, товарищи, такой вопрос концептуального плана возник.
Иногда нужно в плагине использовать функции библиотеки 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’а только перенаправлять вызов в рабочий поток, пользуясь средствами межпроцессного/межпоточного взаимодействия. Я прав, или это у меня приступ мании преследования?