Pie*_*Wyk 0 delphi shellexecute
如果我在命令/ dos窗口中执行以下命令
schtasks.exe /delete /tn "MMP4CDownloadCheck" /f
Run Code Online (Sandbox Code Playgroud)
结果如下
ERROR: The specified task name "MMP4CDownloadCheck" does not exist in the system.
Run Code Online (Sandbox Code Playgroud)
使用我的应用程序(Delphi XE)中运行相同命令时是否可以检索返回值ShellExec?
我运行如下:
AHWnd := ShellExecute(0, nil, PChar('schtasks.exe'), PChar(Params), nil, SW_HIDE);
Run Code Online (Sandbox Code Playgroud)
先感谢您.
问候,彼得.
没有ShellExecute.可能与ShellExecuteEx或CreateProcess.您需要调用GetExitCodeProcess,为此您需要创建进程的句柄.
对于您的具体情况,也许最好避免调用schtasks.exe并使用Task Scheduler 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;
Run Code Online (Sandbox Code Playgroud)