Здравствуйте, Eugene Sh, Вы писали:
ES>У меня такая проблема. ES>Есть COM`овская dll`ка, написанная на C++. Внутри dll`ки вызывается CoInitializeEx(NULL, COINIT_MULTITHREADED) — там необходимо использовать многопоточную модель. ES>При вызове методов dll`ки из приложения, написанного на C++, всё нормально. А при вызове из приложения, написанного на VB, CoInitializeEx возвращает ошибку RPC_E_CHANGED_MODE — "cannot change thread mode after it is set". ES>Вызов делается так: ES>Dim a As Object ES>Set a = CreateObject("XXX.XXX") ES>a.TestCoInitEx
ES>Кто-нибудь сталкивался с этим? Как вызвать из VB методы многопоточной COM`овской dll`ки?
Проблемма возникает из за того, что VB уже инициализировал аппартамент как STA. Вызывать обьекты, находящиеся в MTA нужно так же как и те, которые в STA. т.е просто вызывать их, но не забыть их правильно зарегистрировать.
ЗЫ: Обычно при реализации обьекта в dll не надо вызывать CoInitialize так как CoInitialize обычно вызывает или клиент COM обьекта или подсистема COM не явно.