您当前的位置是:首页-DELPHI教程

写一个定时执行的程序-计划任务

【发表于】:2010/10/22 14:53:00  已被访问:2123次

代码实现的话参考.  
计划任务是一个 COM服务程序,在 98 以前,计划任务可以在托盘里看到并被
停止,但在 2000 以后,它做为了一个服务在系统启动时就同时启动了。计划
任务可以通过编程建立或删除计划任务项目,可以编程调用和编辑已有项目的
计划内容,由于 Delphi 不直接支持计划任务的接口,所以必须手工自己转化
计划任务中用到的有关数据类型和接口声明,但是好在用 Delphi 编程的高手
如云,象这种转化头文件的烦琐工作,早就有人做好了,拿来用就是。
计划任务由以下接口组成:
    ITaskScheduler : 这个接口是最先需要建立的,通过它可以给项目一个标题
             ITask : 它继承自 IScheduledWorkItem 接口,当获得了前面一个
                     接口后,可以用这个接口实现一个计划任务项目的所有工
                     作。如设置执行的程序,安排起止时间等等。
IScheduledWorkItem :
    IEnumWorkItems : 这个接口特意安排来列举当前所有的计划任务项目。
      ITaskTrigger : 设置触发事件的接口。
建立 ITaskScheduler 接口很简单,只要使用 CoCreateInstance 这个 API 或者
Delphi 封装函数 CreateComObject 就可以建立它,但我在实际的编程中,发现使
用 Delphi 的封装函数居然并不是直接获取这个接口,先必须获取 IUnknown 然后
再使用 as 转换过去,这样不是很麻烦吗,所以我直接用:
var
 TaskSch:ITaskScheduler;
begin
CoCreateInstance(CLSID_CTaskScheduler,
                                  nil,
                 CLSCTX_INPROC_SERVER,
                   IID_ITaskScheduler,
                             TaskSch);
end;
来获得 ITaskScheduler 接口,一旦获得这个接口,就可以使用这个接口的一个方
法:ITaskScheduler.NewWorkItem 来建立一个新项目了。同时,它也返回一个 ITask
的接口给我们,为了将最终建立的项目保存为磁盘文件,必须利用系统的 IPersistFile
接口,这个接口中有保存和载入磁盘文件的方法。于是可以建立一个任务项目:
var
 UnK:IUnknown;
 Task:ITask;
 Trig:ITaskTrigger;
 PerFile:IPersistFile;
bgein
 TaskSch.NewWorkItem('测试',CLSID_CTask,IID_ITask,Unk);
 Task:=Unk as ITask;

 Task.SetApplicationName('C:\Windows\Notepad.exe'); // 设置需要执行的程序
 Task.SetComment('这是一个测试项目'); // 设置描述

// 获得 ITaskTrigger 接口
    Task.CreateTrigger(NewTrigger,Trig);

// 初始化 TTaskTrigger 数据结构
    ZeroMemory(@Trigger,SizeOf(TTaskTrigger));

// 设置具体的数值
    with Trigger do
     begin
      wBeginYear:=2003;
      wBeginMonth:=3;
      wBeginDay:=1;
      cbTriggerSize:=SizeOf(TTaskTrigger);
      wStartHour:=8;
      TriggerType:= TASK_TIME_TRIGGER_DAILY;
      Type_.Daily.DaysInterval:= 1;
    end;

   Trig.SetTrigger(@Trigger);

 Task.QueryInterface(IID_IPersistFile,PerFile);
 PerFile.Save(nil,true);
end;

取到转化好的头文件后,编程还是比较简单的,在实际编程中,我们会遇到 PChar 、
String 、WideChar 的问题,如果转换不当,就会有乱码。Delphi 提供给我们 2 个
封装函数:WideCharTOString 将 WideChar 转为 String
          StringToWideChar 将 string 转为 WideChar
一般的,我们使用这样的方法进行转化:
var
 Buff:array[0..1024] of WideChar;
 TempStr:string;
 FileName:string;
 WChar:PWideChar;
begin
 FileName:='C:\Windows\Notepad.exe'; // 从 OpenDlg 取到的文件名
 WChar:=StringToWideChar(FileName,Buff,Length(FileName)+1); // 转为 WideChar
 TempStr:=WideCharTOString(WChar); // 转为 string
end;
从中可以看到,我使用了 Buff 做中间转换,省掉了对 WChar 分配内存和释放内存的步
骤,不过,这样一来需要注意的是,WChar 指向的是 Buff 首地址,并没有自己的内存

 

 也可以

你可以在你和程序中调用windows AT指令来实现定时功能,这个命令用法如下:
AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。

AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\computername] time [/INTERACTIVE]
    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

\\computername       指定远程计算机。如果省略这个参数,
                     会计划在本地计算机上运行命令。
id                   指定给已计划命令的识别号。
/Delete              删除某个已计划的命令。如果省略 id,
                     计算机上所有已计划的命令都会被删除。
/yes                 不需要进一步确认时,跟删除所有作业
                     的命令一起使用。
time                 指定运行命令的时间。
/interactive         允许作业在运行时,与当时登录的用户
                     桌面进行交互。
/every:date[,...]    每个月或每个星期在指定的日期运行命
                     令。如果省略日期,则默认为在每月的
                     本日运行。
/next:date[,...]     指定在下一个指定日期(如,下周四)运
                     行命令。如果省略日期,则默认为在每
                     月的本日运行。
"command"            准备运行的 Windows NT 命令或批处理
                     程序。

 
上下篇: 在Delphi中静态调用DLL DELPHI如何操作INI文件

最新推荐信息