Delphi Получить возвращаемое значение при выполнении команды dos с использованием ShellExec

Если я выполню следующую команду в окне команды / dos

schtasks.exe /delete /tn "MMP4CDownloadCheck" /f

результат таков

ERROR: The specified task name "MMP4CDownloadCheck" does not exist in the system.

Можно ли получить возвращаемые значения при выполнении той же команды из моего приложения (Delphi XE) с помощью ShellExec?

Я запускаю его следующим образом:

AHWnd := ShellExecute(0, nil, PChar('schtasks.exe'), PChar(Params), nil, SW_HIDE);

Заранее спасибо.

С уважением, Питер.


person Pieter van Wyk    schedule 20.07.2011    source источник


Ответы (1)


Не с ShellExecute. Возможно, с помощью ShellExecuteEx или CreateProcess. Вам необходимо вызвать GetExitCodeProcess и для что вам нужен дескриптор созданного процесса.

В вашем конкретном случае, возможно, лучше избегать вызова schtasks.exe и использовать API планировщика заданий. См. JclTask в JCL.

Пример использования, который я нашел в одном из своих старых модулей (для Delphi 2007):

procedure TSetupDataModule.AddDatabaseBackupTask;
var
  FileName: WideString;
  Scheduler: ITaskScheduler;
  Task: ITask;
  TaskPersist: IPersistFile;
  TriggerIndex: Word;
  Trigger: ITaskTrigger;
  TriggerData: TTaskTrigger;
begin
  OleCheck(CoCreateInstance(CLSID_CTaskScheduler, nil, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, Scheduler));
  OleCheck(Scheduler.NewWorkItem(BackupTaskName, CLSID_CTask, IID_ITask, IUnknown(Task)));

  FileName := WideIncludeTrailingPathDelimiter(FDatabaseTargetDir) + BackupToolFileName;
  OleCheck(Task.SetApplicationName(PWideChar(FileName)));

  OleCheck(Task.SetWorkingDirectory(PWideChar(WideExcludeTrailingPathDelimiter(FDatabaseTargetDir))));
  OleCheck(Task.SetAccountInformation('', nil)); // run as local system

  FillChar(TriggerData, SizeOf(TriggerData), 0);
  TriggerData.cbTriggerSize := SizeOf(TriggerData);
  TriggerData.wBeginYear := YearOf(Today);
  TriggerData.wBeginMonth := MonthOf(Today);
  TriggerData.wBeginDay := DayOf(Today);
  TriggerData.wStartHour := 0;
  TriggerData.wStartMinute := 0;
  TriggerData.rgFlags := 0;
  TriggerData.TriggerType := TASK_TIME_TRIGGER_DAILY;
  TriggerData.Type_.Daily.DaysInterval := 1;

  OleCheck(Task.CreateTrigger(TriggerIndex, Trigger));
  OleCheck(Trigger.SetTrigger(@TriggerData));

  TaskPersist := Task as IPersistFile;
  OleCheck(TaskPersist.Save(nil, True));
end;

procedure TSetupDataModule.RemoveDatabaseBackupTask;
var
  Scheduler: ITaskScheduler;
begin
  OleCheck(CoCreateInstance(CLSID_CTaskScheduler, nil, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, Scheduler));
  OleCheck(Scheduler.Delete(BackupTaskName));
end;
person Ondrej Kelle    schedule 20.07.2011
comment
Я нахожу schtasks.exe более привлекательным, поскольку он создает задачи, которые видны из приложения «Запланированные задачи» в Windows. Я полагаю, что JclTask ​​будет лучше для Delphi. Знаете ли вы какие-либо примеры, показывающие, как использовать его в приложении? - person Pieter van Wyk; 20.07.2011
comment
Если вы используете API, задачи появятся в приложении «Назначенные задачи» в Windows. Приложение также использует API. Я добавлю пример через мгновение. - person Ondrej Kelle; 20.07.2011