delphi 为什么ITaskFolder.RegisterTaskDefinition不起作用?

chhkpiq4  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(83)

我正尝试使用 Delphi 在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方法。它返回nil,我认为这是一个错误,因为在C:\Windows\System32\Tasks的目录中没有创建任务。正在正确创建目录MyFolder
但是我甚至不能定义错误类型,因为在 Delphi 版本的TaskEngine API 2.0中没有返回错误代码。看起来函数的所有参数都是正确的,但它继续返回nil而不是IRegisteredTask对象。
也许我忘了什么,或者我做错了什么。
我在Windows 7和 Delphi XE 10.2上工作。UAC已关闭。

mefy6pfw

mefy6pfw1#

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

仅限任务验证

任务验证器验证描述任务的XML的语法,但不注册任务。此常量不能与ASK_CREATE、ASK_UPDATE或ASK_CREATE_OR_UPDATE值组合使用。
因此,调用在ppTask参数中返回NULL指针,因为尚未注册任何任务。如果你没有使用魔法常量,而是使用正确定义的常量,比如ASK_CREATE而不是2(或者ASK_VALIDATE_ONLY而不是1),你会发现问题很简单。

相关问题