OpenTemplate ошибка инициализации COM
Подскажите, пожалуйста, почему возникает ошибка инициализации 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.
Сервис поддержки клиентов работает на платформе UserEcho
День добрый.
Уточните какая версия ОС установлена на ПК. И какая версия 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, внесли изменения, и закрыли его, при следующем создании объект находится ещё на стадии завершения работы, т.е. деинициализация библиотеки для работы в потоке ещё не завершена, по этой причине повторная инициализация становится не возможной.
Инициализация работы с СОМ объектом в потоке.
Создание экземпляра объекта Excel.
....
Закрытие библиотеки COM в текущем потоке.Нет, такой возможности в скриптах нет.
Если вкратце: исходя из того что каждый скрипт в СИМП работает в отдельном потоке, то для создания экземпляра Excel, вызывается функция CoInitializeEx для инициализация работы с СОМ объектом в потоке.
Результат этой функции - успешность или не успешность, инициализации. Одна из ошибок которая может произойти - это то что - библиотека COM уже инициализирована в этом потоке. Могу предположить что после того как создали объект Excel, внесли изменения, и закрыли его, при следующем создании объект находится ещё на стадии завершения работы, т.е. деинициализация библиотеки для работы в потоке ещё не завершена, по этой причине повторная инициализация становится не возможной.
И что с этим делать? Я сделал так, чтобы скрипт вызывался однократно при нажатии на кнопку.
Результат тот же.
Уточните Монитор запускается в ОС с правами админа?
Я работаю под учетной записью с правами администратора.
Ок. Отдал на проверку, по результатам напишу. Подскажите по каким причинам решили использовать именно работу с Excel, судя по коду задача достаточно простая, почему не использовали работу к примеру с CSV файлом, он менее громоздкая в плане ресурсов, чем каждый раз поднимать объект Excel.