Not with ShellExecute
. Possibly with ShellExecuteEx
or CreateProcess
. You need to call GetExitCodeProcess
and for that you need the handle of the created process.
For your specific case, perhaps it's better to avoid calling schtasks.exe
and use the Task Scheduler API instead. See JclTask
in the JCL.
An example usage I've found in one of my old units (for 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;