К списку форумов К списку вопросов
OLE Delphi threads
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
Всё понятно, уже разобрался

К списку вопросов на форуме Программирование

>>