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), 你会发现问题很简单。
我正在尝试为 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), 你会发现问题很简单。