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