Re[2]: Вызов методов COM`овской dll из Rational Robot`а
От: Eugene Sh Россия  
Дата: 09.07.03 15:26
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, Eugene Sh, Вы писали:


ES>>Из скрипта Rational Robot`а я пытаюсь вызвать методы из этой dll`ки:

ES>>Dim a As Object
ES>>Set a = CreateObject("XXX.XXX")
ES>>a.SameMethod 'В этом методе вызывается CoInitializeEx(...)

ES>>Так проблема в том, что CoInitializeEx возвращает ошибку RPC_E_CHANGED_MODE — "Cannot change thread mode after it is set". Хотя при вызове тех же методов из программы, написанной на C++, всё проходит нормально.


ES>>P.S. Если сделать dll`ку однопотоковой и вызывать CoInitialize(NULL), то он не вернёт никакой ошибки.


GS>А где ты в dll-ле вызываешь CoInitializeEx? Это допустимо только в тобой созданных потоках.


Вызываю я его в конструкторе класса.
Если вызывать CoInitialize(0), то всё нормально — он возвращает S_FALSE, т.е. уже вызвана CoInitialize для однопоточной модели.
Проблема даже не в вызове CoInitializeEx, а в том, что моя dll вызывается в однопоточной модели. Внутри неё вызывается CoCreateInstance для объекта, определённого в другой dll(многопоточной). И вот тут проблема — CoCreateInstance возвращает E_NOINTERFACE.
А при тестировании моей dll из программы, написанной на C++, всё нормально — она загружается в многопоточной модели, и дальнейший вызов CoCreateInstance проходит нормально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.