Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2015, 17:06   #1
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию Delphi XE7 и Excel 2010

Здравствуйте, уважаемые коллеги и любители программирования.
Помогите, пожалуйста, решить следующую проблему.
Имеются следующие ОС и ПО: Windows 7 Профессиональная x86 (32-битная) sp1, Microsoft Office Professional 2010, Embarcadero RAD Studio XE7: Delphi XE7, встроенный планировщик заданий (taskschd.msc).
Написал программу, которая создает Excel-файл, вносит в ячейки данные, форматирует книгу и сохраняет ее. Программа, можно сказать, работает на ура, кроме одного случая. При запуске ее через планировщик заданий Excel-файл не сохраняется, т.е. не работает метод FWorkbook.SaveAs (как и FWorkbook.Save). Происходит следующая ошибка: "Метод SaveAs из класса Workbook завершен неверно".
Помогите решить вопрос.
Ниже привожу исходный код функции из моей программы по работе с Excel.
Код:
function TMainForm.Test: integer;
const
  xlWorkbookDefault = $00000033; // = xlOpenXMLWorkbook
var
  FCLSID: TCLSID;
  FExcel, FWorkbook: OLEVariant;
  FName: string;
begin
  Result := 0;
  FName := ExtractFilePath(Application.ExeName) + 'test' +
    FormatDateTime('_dmmyy_hnns', now) + '.xlsx';
  // проверка, установлен ли  excel
  if (CLSIDFromProgID(PChar('Excel.Application'), FCLSID) = S_OK) then
  begin
    // запускаем Excel и получаем на него ссылку
    try
      FExcel := CreateOleObject('Excel.Application');
      FExcel.Visible := false;
    except
      inc(Result, 2);
    end;
    if Result = 0 then
    begin
      FExcel.DisplayAlerts := false;
      FExcel.SheetsInNewWorkbook := 1;
      FWorkbook := FExcel.Workbooks.Add; // создание новой книги Excel
      try
        FWorkbook.SaveAs(FName, xlWorkbookDefault); // сохраняем книгу на диск
      except
        on e: Exception do
        begin
          inc(Result, 4);
          toLog('', '4  ' + e.Message);
        end;
      end;
      try
        FWorkbook.WorkSheets[1].Range['A1:B1'].Value := now;
        FWorkbook.WorkSheets[1].Columns[2].ColumnWidth := 20;
        FWorkbook.WorkSheets[1].Columns[1].NumberFormat := 'ДД.ММ.ГГ';
      except
      end;
      try
        FWorkbook.Save; // сохраняем книгу на диск
      except
        on e: Exception do
        begin
          inc(Result, 4);
          toLog('', '8  ' + e.Message);
        end;
      end;
      if not VarIsEmpty(FWorkbook) then
        try
          FWorkbook.Close;
        except
        end;
      FWorkbook := Unassigned;
      if not VarIsEmpty(FExcel) then
      begin
        try
          FExcel.DisplayAlerts := false;
          FExcel.Quit; // (FExcel.Application.quit;) - Закрываем Excel
        except
        end;
      end;
      FWorkbook := Unassigned;
      FExcel := Unassigned;
    end;
  end;
end;
P.S.
1. Функцию я упростил (см выше); создал отдельный проект, состоящий только из этой функции, ее автозапуска, логирования и автозакрытия приложения - ситуация аналогичная.
2. Возможно (но проверить возможности пока не имею):
а)Если программу скомпилировать в Delphi 2010, то все будет работать;
б)Если программу, скомпилированную в любой версии Delphi ( 2010 - XE7), запускать под Windows XP либо Windows 2003, то все будет работать.
3. Начиная с Delphi XE2 в проекты часто вставляю:
Код:
{$IF CompilerVersion >= 23}
{$IF DECLARED(System.Variants.DispatchUnsignedAsSigned)}
  System.Variants.DispatchUnsignedAsSigned := true;
{$IFEND}
{$ENDIF}
для некоторых методов форматирования в Excel. В данной программе этот код никак не влияет на ошибку.
4. Ещё раз повторюсь. Программа не работает при запуске через ПЛАНИРОВЩИК ЗАДАЧ. При ЛЮБОМ другом запуске (через среду разработки, через файл, через ярлык, с любыми правами) ВСЕ РАБОТАЕТ.
5. Во вложении проект, созданный в XE7.
Вложения
Тип файла: zip Exceltest.zip (81.5 Кб, 48 просмотров)

Последний раз редактировалось GNDragonFly; 21.05.2015 в 19:50.
GNDragonFly вне форума Ответить с цитированием
Старый 21.05.2015, 18:20   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

exe где находится? Как у планировщика с полномочиями на запись в каталог exe-шника? Немного не так конечно - с какими полномочиями он exe запускает?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.05.2015, 19:47   #3
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
exe где находится? Как у планировщика с полномочиями на запись в каталог exe-шника? Немного не так конечно - с какими полномочиями он exe запускает?
1) Программа (даже та, которая во вложении) пишет лог в текстовый файл (открывает его на запись, если файла нет - то создает его).
2) Также аналогичные мои программы, которые запускаются через планировщик, создают каталоги и подкаталоги, копируют и удаляют файлы.
Соответственно, проблем с записью на диск (именно программой) нет, но про приложение MS Excel 2010 Pro (а именно им сохраняется книга) ничего сказать не могу.
Помимо этого уточню:
1) Пробовал создавать задание в планировщике от имени текущего пользователя, от админа ПК и от админа доменной сети - результаты одинаковы. PS комп входит в домен.
2) Пути для сохранения excel-файла ставил разные: а) корень диска C; б) папка на диске C; в,г) аналогично с дисками D и E; д) в папке Delphi проекта; е) в папке "Мои Документы"; ж) в расшареной для других пользователей сети папке на моем компе, со всеми правами чтения и записи.
Другими словами перепробовал практически все варианты, которые пришли в голову.
Но! Вполне возможно, что из-за политики безопасности Windows 7 для задач, запущенных через планировщик, и возникают эти грабли.

Сегодня проверил.
Программа, скомпилированная в Delphi XE2 и XE7 нормально (без сбоев) отрабатывает через планировщик задач в Windows XP sp3.
Про Delphi 2010 не проверял.

Последний раз редактировалось Stilet; 25.05.2015 в 14:37.
GNDragonFly вне форума Ответить с цитированием
Старый 25.05.2015, 13:36   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,868
По умолчанию

Цитата:
Сообщение от GNDragonFly Посмотреть сообщение
1) Пробовал создавать задание в планировщике от имени текущего пользователя, от админа ПК и от админа доменной сети - результаты одинаковы.
В планировщике галку "Выполнить с наивысшими правами" не пробовал ставить?
northener вне форума Ответить с цитированием
Старый 26.05.2015, 08:53   #5
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
В планировщике галку "Выполнить с наивысшими правами" не пробовал ставить?
Да, делал. Кажись, уже все перепробовал.
GNDragonFly вне форума Ответить с цитированием
Старый 26.05.2015, 09:52   #6
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
Лампочка

В общем, частично я проблему решил.
В планировщике заданий (Windows 7 pro sp1 с обновлениями на апрель) при выборе действия "Создать простую задачу..." создавалась СКРЫТАЯ задача, хотя галочка в этом пункте не стоит. Решилось довольно тривиально: передергиванием галочки "Скрытая задача". Соответственно задача запускается "видимой" и сохранение Excel-файла происходит без ошибок.
Однако хотелось бы решить вопрос, когда задача запускается скрытой. Так что если есть идеи - делитесь.
GNDragonFly вне форума Ответить с цитированием
Старый 03.06.2015, 12:22   #7
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Все возвращаюсь к своей проблеме (не для поднятия темы). Путем экспериментов оказалось, что предыдущий пост (за 26.05.2015) неверный.
Передергивание галочки "Скрытая задача" ничего не дает, т.к. проблема не в этом пункте,а в пункте: "Выполнять только для зарегистрированного пользователя". Если точка стоит на этом пункте, то выполнение задачи идет не в скрытом виде, и Excel-файл сохраняется без проблем. Если же стоит точка "Выполнять вне зависимости от регистрации пользователя", то файл не сохраняется.
Другими словами, если сервак (либо комп) включен, но пользователь не залогинен, то при выборе 1-го пункта задача не выполняется, при выборе второго пункта создается "скрытая" задача, влекущая за собой проблему, описанную в 1-м посте.
GNDragonFly вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оформление кода в Delphi XE7 Shouldercannon Общие вопросы Delphi 2 22.02.2015 11:17
Экспорт из Excel в MS SQL Server 2008 с помощью Delphi XE7 TimurUfa БД в Delphi 0 16.01.2015 12:20
Delphi xe7 bluetooth андройд Volt Общие вопросы Delphi 2 12.12.2014 13:34
Delphi XE7 & Genymotion NEoMASTERR Общие вопросы Delphi 3 04.10.2014 22:22
Delphi и excel 2010 Immo Общие вопросы Delphi 4 08.05.2013 22:19