2011-07-20 17 views
0

を使用して、DOSコマンドを実行しているとき、私はDelphiはShellExec

schtasks.exe /delete /tn "MMP4CDownloadCheck" /f 

コマンド/ DOSウィンドウで次のコマンドを実行すると、以下のように結果が

ERROR: The specified task name "MMP4CDownloadCheck" does not exist in the system. 

はそれを取得することは可能です戻り値を取得します。 ShellExecを使用して、私のアプリケーション(Delphi XE)から同じコマンドを実行したときの戻り値?

次のように私はそれを実行します。

AHWnd := ShellExecute(0, nil, PChar('schtasks.exe'), PChar(Params), nil, SW_HIDE); 

は、事前にありがとうございます。

よろしく、Pieter。

答えて

5

ShellExecuteではありません。可能であればShellExecuteExまたはCreateProcessとなります。 GetExitCodeProcessに電話する必要があります。そのためには、作成されたプロセスのハンドルが必要です。

具体的なケースでは、schtasks.exeに電話するのを避け、代わりにTask Scheduler APIを使用することをおすすめします。 JCLJclTaskを参照してください。

私は(2007年デルファイのために)私の古い単位の一つで見つけた使用例:

procedure TSetupDataModule.AddDatabaseBackupTask; 
var 
    FileName: WideString; 
    Scheduler: ITaskScheduler; 
    Task: ITask; 
    TaskPersist: IPersistFile; 
    TriggerIndex: Word; 
    Trigger: ITaskTrigger; 
    TriggerData: TTaskTrigger; 
begin 
    OleCheck(CoCreateInstance(CLSID_CTaskScheduler, nil, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, Scheduler)); 
    OleCheck(Scheduler.NewWorkItem(BackupTaskName, CLSID_CTask, IID_ITask, IUnknown(Task))); 

    FileName := WideIncludeTrailingPathDelimiter(FDatabaseTargetDir) + BackupToolFileName; 
    OleCheck(Task.SetApplicationName(PWideChar(FileName))); 

    OleCheck(Task.SetWorkingDirectory(PWideChar(WideExcludeTrailingPathDelimiter(FDatabaseTargetDir)))); 
    OleCheck(Task.SetAccountInformation('', nil)); // run as local system 

    FillChar(TriggerData, SizeOf(TriggerData), 0); 
    TriggerData.cbTriggerSize := SizeOf(TriggerData); 
    TriggerData.wBeginYear := YearOf(Today); 
    TriggerData.wBeginMonth := MonthOf(Today); 
    TriggerData.wBeginDay := DayOf(Today); 
    TriggerData.wStartHour := 0; 
    TriggerData.wStartMinute := 0; 
    TriggerData.rgFlags := 0; 
    TriggerData.TriggerType := TASK_TIME_TRIGGER_DAILY; 
    TriggerData.Type_.Daily.DaysInterval := 1; 

    OleCheck(Task.CreateTrigger(TriggerIndex, Trigger)); 
    OleCheck(Trigger.SetTrigger(@TriggerData)); 

    TaskPersist := Task as IPersistFile; 
    OleCheck(TaskPersist.Save(nil, True)); 
end; 

procedure TSetupDataModule.RemoveDatabaseBackupTask; 
var 
    Scheduler: ITaskScheduler; 
begin 
    OleCheck(CoCreateInstance(CLSID_CTaskScheduler, nil, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, Scheduler)); 
    OleCheck(Scheduler.Delete(BackupTaskName)); 
end; 
+0

私はそれがスケジュールから見えるタスクを作成して、より魅力的な 'schtasks.exe'を見つけるのですかWindowsのタスクアプリ。私はJclTask​​がDelphiの方が良いと思います。アプリケーションでどのように使用するのかを示す例がありますか? –

+0

APIを使用すると、タスクはWindowsのスケジュールされたタスクアプリに表示されます。アプリもAPIを使用しています。私はすぐに例を追加します。 –

+0

ありがとうございました。 –