Delphi Получить возвращаемое значение при запуске команды DOS с помощью ShellExec - PullRequest
0 голосов
/ 20 июля 2011

Если я выполню следующую команду в окне командной строки / 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);

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

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

1 Ответ

5 голосов
/ 20 июля 2011

Не с 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;
...