我正尝试使用 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已关闭。
1条答案
按热度按时间mefy6pfw1#
您正在使用ASK_VALIDATE_ONLY标志调用RegisterTaskDefinition方法。该标志的描述如下:
仅限任务验证
任务验证器验证描述任务的XML的语法,但不注册任务。此常量不能与ASK_CREATE、ASK_UPDATE或ASK_CREATE_OR_UPDATE值组合使用。
因此,调用在ppTask参数中返回NULL指针,因为尚未注册任何任务。如果你没有使用魔法常量,而是使用正确定义的常量,比如ASK_CREATE而不是2(或者ASK_VALIDATE_ONLY而不是1),你会发现问题很简单。