0
На рассмотрении

OpenTemplate ошибка инициализации COM

Станислав С 4 года назад в Редактор каналов обновлен СИМП Лайт (тех поддержка) 4 года назад 11

Подскажите, пожалуйста, почему возникает ошибка инициализации COM при запуске функции OpenTemplate?

Для скрипта задан интервал запуска - 1 раз в секунду.

{Pascal Script}
{ Make_Journal. Сгенерировать вахтенный журнал }
Const
TEMPLATE_NAME = 'D:\slProject\UserSetting\Journal_Template.xlsx';
J_NAME = 'D:\slProject\UserSetting\Journal_%s.xlsx';

Var
bMake : Boolean = false;
res, iTagVal : Integer = 0;
row : Integer = 3;
sDate, sDateStart, sDateStop, sTime, sTemp : String;
sCellName, sTagName, sTagVal, sJournalName : String;

Begin

  if FileExists(TEMPLATE_NAME) then
    res := Excel.OpenTemplate(TEMPLATE_NAME);
  if res <> 0 then begin
    sTemp := 'Ошибка ' + IntToStr(res) + ' открытия шаблона для файла : ' + TEMPLATE_NAME;
    Log(esInfo, sTemp);
   end
else begin
  row := ReadValue('JournalRow');
  sTemp := 'Запись в строку ' + IntToStr(row);
  Log(esInfo, sTemp);
  sDate := FormatDateTime('DD.MM.YYYY', Now);
  sTime := FormatDateTime('HH:MM:SS', Now);
  sCellName := 'A' + IntToStr(row);  
  Excel.Cell[sCellName] := sDate;
  sCellName := 'B' + IntToStr(row);
  Excel.Cell[sCellName] := sTime;
  Excel.Show();
  Excel.Save(sJournalName);
  Excel.Close();

  row := row + 1;
  WriteValue('JournalRow', row);

end

end.

На рассмотрении

День добрый.

Уточните какая версия ОС установлена на ПК. И какая версия SIMP.

Работа с Excel связана с накладными расходами на создание объекта Excel, и его уничтожение. По этой причине я бы рекомендовал буферизировать данные внутри скрипта, и с более менее частым интервалом сбрасывал данные в Excel документ.

Windows 7 SP 1

SimpLight v4.7.5.101

Смысл в том, чтобы заносить данные в журнал периодически (несколько десятков параметров). 

После того, как проведу наладку, буду вызывать скрипт раз в час.

Сейчас нужно понять, в чем проблема. В другом проекте практически такой же код работает нормально.

Проблема может быть как на уровне ОС, так и установленной версии Excel. Посмотрите в диспетчере задач, не "висят" ли там экземпляры запущенного Excel.

Обычно после запуска Монитора висит процесс Excel. После закрытия Монитора продолжает висеть. Я его вручную убиваю.

Какие возможные причины возникновения данной ошибки?

Опишите, пожалуйста, механизм работы ваших функций с точки зрения ОС.

Что происходит при вызове функции OpenTemplate и процедуры Close?

Можно ли управлять явным образом запуском и остановкой процесса Excel.exe?

Например, через CreateOleObject('Excel.Application'). 

Если да, то приведите, пожалуйста, пример рабочего кода.

День добрый.

Какие возможные причины возникновения данной ошибки?

Если вкратце: исходя из того что каждый скрипт в СИМП работает в отдельном потоке, то для создания экземпляра Excel, вызывается функция CoInitializeEx для инициализация работы с СОМ объектом в потоке.

Результат этой функции - успешность или не успешность, инициализации. Одна из ошибок которая может произойти - это  то что - библиотека COM уже инициализирована в этом потоке. Могу предположить что после того как создали объект Excel, внесли изменения, и закрыли его, при следующем создании объект находится ещё на стадии завершения работы, т.е. деинициализация библиотеки для работы в потоке ещё не завершена, по этой причине повторная инициализация становится не возможной. 

Опишите, пожалуйста, механизм работы ваших функций с точки зрения ОС.
Что происходит при вызове функции OpenTemplate и процедуры Close?

Инициализация работы с СОМ объектом в потоке.

Создание экземпляра объекта Excel.

....

Закрытие библиотеки COM в текущем потоке.

Можно ли управлять явным образом запуском и остановкой процесса Excel.exe?
Например, через CreateOleObject('Excel.Application').
Если да, то приведите, пожалуйста, пример рабочего кода.

Нет, такой возможности в скриптах нет.

Если вкратце: исходя из того что каждый скрипт в СИМП работает в отдельном потоке, то для создания экземпляра Excel, вызывается функция CoInitializeEx для инициализация работы с СОМ объектом в потоке.

Результат этой функции - успешность или не успешность, инициализации. Одна из ошибок которая может произойти - это то что - библиотека COM уже инициализирована в этом потоке. Могу предположить что после того как создали объект Excel, внесли изменения, и закрыли его, при следующем создании объект находится ещё на стадии завершения работы, т.е. деинициализация библиотеки для работы в потоке ещё не завершена, по этой причине повторная инициализация становится не возможной.


И что с этим делать? Я сделал так, чтобы скрипт вызывался однократно при нажатии на кнопку. 

Результат тот же.

Уточните Монитор запускается в ОС с правами админа?

Я работаю под учетной записью с правами администратора.

Ок. Отдал на проверку, по результатам напишу. Подскажите по каким причинам решили использовать именно работу с Excel, судя по коду задача достаточно простая, почему не использовали работу к примеру с CSV файлом, он менее громоздкая в плане ресурсов, чем каждый раз поднимать объект Excel.

Сервис поддержки клиентов работает на платформе UserEcho