delphi ITaskFolder.RegisterTaskDefinition 不工作

delphi ITaskFolder.RegisterTaskDefinition not working

我正在尝试为 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 方法之前它工作正常。它 return 为零,我认为这是一个错误,因为我在 C:\Windows\System32\Tasks 的目录中没有创建任何任务。目录 MyFolder 正在正确创建。但我什至无法定义错误类型,因为在 TaskScheduler api 2.0 的 Delphi 版本中没有错误代码 returning。似乎该函数的所有参数都是正确的,但它继续 return nil 而不是 IRegisteredTask 对象。也许我忘记了什么,或者做错了什么? 我在 Windows 7 和 Delphi XE 10.2 上工作。 UAC 已关闭。

您正在使用 TASK_VALIDATE_ONLY 标志调用 RegisterTaskDefinition 方法。该标志描述如下:

TASK_VALIDATE_ONLY

Task Scheduler verifies the syntax of the XML that describes the task, but does not register the task. This constant cannot be combined with the TASK_CREATE, TASK_UPDATE, or TASK_CREATE_OR_UPDATE values.

所以在ppTask参数中调用returns NULL指针,因为没有任务被注册。如果您没有使用魔术常量并使用适当定义的常量,例如 TASK_CREATE 而不是 2(或 TASK_VALIDATE_ONLY的 1), 你会发现问题很简单。