Я пытаюсь создать задачу для планировщика задач Windows. Вот код.
procedure TForm1.Button1Click(Sender: TObject);
var
ts: ITaskService;
tf: ITaskFolder;
tf2: ITaskFolder;
td: ITaskDefinition;
tr: ITrigger;
tt: ITimeTrigger;
at: IAction;
ae: IExecAction;
rt: IRegisteredTask;
begin
CoInitializeEx(nil, COINIT_MULTITHREADED);
CoCreateInstance(CLSID_TaskScheduler,nil,CLSCTX_INPROC_SERVER,IID_ITaskService,ts);
ts.Connect(unassigned, unassigned, unassigned, unassigned);
try
tf := ts.GetFolder('\MyFolder');
tf2 := tf;
except
tf := ts.GetFolder('\');
tf2 := tf.CreateFolder('\MyFolder', unassigned);
end;
tf._Release;
td := ts.NewTask(0);
td.RegistrationInfo.Author := 'TheAuthor';
tr := td.Triggers.Create(ttTime);
tr.QueryInterface(IID_ITimeTrigger, tt);
tr._Release;
tt.Id := 'Trigger1';
tt.StartBoundary := '2017-07-28T01:20:00';
tt.EndBoundary := '2027-07-28T01:20:00';
tt._Release;
at := td.Actions.Create(taExec);
at.QueryInterface(IID_IExecAction, ae);
at._Release;
ae.Path := 'C:\Windows\System32\Notepad.exe';
ae.WorkingDirectory := 'C:\Windows\System32';
ae.Arguments := '--help';
ae._Release;
rt := nil;
rt := tf2.RegisterTaskDefinition('MyTestTask', td, 1, unassigned, unassigned, tlInteractiveToken, '');
rt._Release;
td._Release;
tf2._Release;
CoUninitialize;
end;
Работает нормально до RegisterTaskDefinition
метода. Он возвращает ноль, и я думаю, что это ошибка, потому что в моем каталоге в C:\Windows\System32\Tasks
не создается задача. Каталог MyFolder
создается правильно. Но я даже не могу определить тип ошибки, потому что в версии Delphi TaskScheduler api 2.0 коды ошибок не возвращаются. Вроде бы все параметры функции правильные, но она продолжает возвращать nil вместо объекта IRegisteredTask. Может я что-то забыл, или что-то не так делаю? Я работаю на Windows 7 и Delphi XE 10.2. УАК отключен.
flags == TASK_VALIDATE_ONLY
, Планировщик задач проверяет синтаксис XML, описывающего задачу, но не регистрирует задачу. Еще одна жертва магических значений :) - person Victoria   schedule 28.07.2017flags
. Я думал, что должно быть значение из набора TTaskCreation, где validateonly равно 0, а create равно 1. Но должно быть значение в соответствии с msdn - create равно 2. - person Alex Pritchin   schedule 28.07.2017