![]() |
![]() |
nalsu 14.10.2004 - 00:57 |
Помогите разобраться с такой проблемой следующий код успешно выполняется в главном потоке (TForm1) var v7,r:olevariant; ... v7:=CreateOleObject('V77.Application'); r:=v7.initialize('c:\conf /M /N','NO_SPLASH_SHOW'); res:=v7.myfunc(1,2,3); ... // myfunc - экспортируемая функция в 1С // в глобальном модуле // Функция myfunc(p1,p2,p3) Экспорт // ... // Возврат рез; // КонецФункции но если его поместить в нить, то появляется ошибка "не выполнена инициализация CoInitialize...", хотя код абсолютно тот же, пробовал вызывать CoInitialize в начале работы нити - не помогает даже пробовал поставить CoInitialize(nil) внутрь цикла нити и что интересно первая итерация прошла (OLE функция возвратила результат) а на 2-й итерации опять косяк и на этом поток завершает работу :( |
VaS 1 - 14.10.2004 - 10:08 |
Метод Execute() нити должен выглядеть следующим образом: begin OleInitialize(nil); try //тут делаешь все, что надо (в цикле до Terminated или до события) finally OleUninitialize; end; end; |
nalsu 2 - 14.10.2004 - 10:49 | Сделал..."Приложение обратилось к интерфейсу, относящемуся к другому потоку" :( |
nalsu 3 - 14.10.2004 - 10:52 | может вызов v7:=CreateOleObject('V77.Application'); следует делать где-то в другом месте (в данный момент я делаю его в ThreadChild.Create после вызова inherited Create;) |
VaS 4 - 14.10.2004 - 12:59 |
Получение интерфесов COM-объекта, их обнуление и обращение к их методам нужно производить в одном и том же потоке (в модели потоков STA). Или же делать маршалинг интерфейсов между потоками (тебе таким заниматься пока рано :) Твой поток - это метод Execute(). Но не конструктор. |
nalsu 5 - 14.10.2004 - 13:29 | Всё понятно, уже разобрался |