Re: Вызов методов COM`овской dll из Rational Robot`а
От: Yatsenko Sergey Россия  
Дата: 10.07.03 03:07
Оценка: 1 (1)
Здравствуйте, Eugene Sh, Вы писали:

ES>Проблема вот в чём.

ES>Есть COM`овская dll`ка, написанная на C++. Внутри неё в вызывается CoInitializeEx(NULL, COINIT_MULTITHREADED) — там необходимо использовать многопоточную модель.
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>Не сталкивался ли кто-нибудь с такой проблемой? Как из Rational Robot`а вызывать методы многопоточной dll`ки?


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


Разберись с потоковыми моделями COM и подразделениями. Вызов CoInitialize и CoInitializeEx в dll'ке возможен только из тобой созданного потока. В этом случае формируется новое подразделение и взаимодействие между однопоточным подразделением и подразделением с моделью свободных потоков, которое было создано в dll'ке, будет происходить с соответствующей синхронизацией и маршалингом, о чем уже позаботится COM.
... << RSDN@Home 1.1 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.