2017-07-27 61 views
1

我正試圖創建一個任務到Windows任務調度器。這是代碼。delphi ITaskFolder.RegisterTaskDefinition不起作用

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上工作。 UAC已關閉。

+1

'flags == TASK_VALIDATE_ONLY',*任務計劃程序驗證描述該任務的XML的語法,但* ***不註冊該任務。***另一個受害者的魔法值:) – Victoria

+1

謝謝,它的工作原理。我誤解了'flags'參數中必須有哪個值。我認爲TTaskCreation組中的值必須是validateonly爲0且create爲1的值。但是必須有根據msdn的值 - create是2. –

回答

4

您打電話給RegisterTaskDefinition方法TASK_VALIDATE_ONLY標誌。這標誌等記載:

TASK_VALIDATE_ONLY

任務計劃程序驗證描述了任務, 但不登記任務的XML的語法。該常數不能與 與TASK_CREATE,TASK_UPDATE或TASK_CREATE_OR_UPDATE值結合使用。因爲沒有任務已經登記在ppTask參數

所以調用返回NULL指針。如果你沒有使用魔術常量,並使用適當的常量,如TASK_CREATE而不是2(或TASK_VALIDATE_ONLY而不是1),你會發現問題很簡單。

+0

.pas中沒有** TASK_CREATE **或** TASK_VALIDATE_ONLY **常量api 2.0庫我使用。也許我有錯誤的庫,但最好將這組常量添加到它以供將來使用。在Delphi中,它們從函數的Result中刪除HRESULT錯誤代碼(和S_OK),並在那裏移動返回的接口實例,如IRegisteredTask,它們是var參數。所以我看不出函數的結果是否是錯誤的。所以我遇到的問題並不簡單。但你是對的。我的代碼沒有_releases和CoInitializeEx/CoUninitialize。 –

+0

我明白我的問題的來源。有TTaskCreation類型,看起來像'TTaskCreation =(tcValidateOnly,tcCreate,tcUpdate = 4,tcCreateOrUpdate = 6,tcDisable = 8,tcDontAddPrincipalAce = $ 10,tcIgnoreRegistrationTriggers = $ 20);'。它們是來自msdn的標誌,但是這種類型有一個錯誤,它使得Ord函數返回錯誤的結果。在出現錯誤後,我把數字1(這個動作幾乎是Ord)在函數調用 - 不兼容的類型integer和TTaskCreation。所有我必須做的解決這個問題的零結果是糾正TaskCreation'TTaskCreation =(tcValidateOnly = 1,tcCreate = 2,' –

+0

現在我可以在調用函數'rt:= tf2.RegisterTaskDefinition('MyTestTask' td,ord(tcCreate),unassigned,unassigned,tlInteractiveToken,'');' –

相關問題