在Windows系统中,任务计划程序是一个强大的工具,它允许用户和开发者在预定的时间自动执行程序。然而,编写一个任务计划程序可能会相当复杂,因为它涉及到多个属性页面和一个“高级”对话框。为了简化这一过程,开发了CScheduledTask类,它可以帮助创建简单的任务,并理解使用任务计划程序的基础知识。
这个类的设计初衷是提供一个易于理解和使用的接口,而不是实现任务计划程序的所有功能。目前,CScheduledTask类可以创建和删除任务计划程序中的事件。任务可以有简单的计划,包括一次性、每天、每周或每月。
CScheduledTask类是用MSVC 6.0在Win 98上编写的。它应该可以在Unicode模式下正常工作,尽管还没有测试过。使用了MSVC 6.0特有的一些函数,例如CTime::GetAsSystemTime()和CString::Delete()。如果要在MSVC 5.0下构建,需要将这些部分转换回使用MFC 4.2函数。还需要安装INEtSDK或Platform SDK,因为需要链接MSTASK.LIB以获取任务计划程序的GUID,并包含MSTASK.H以获取接口。
请注意,这个类不与AT服务接口,AT服务是NT 4及更早版本上的默认任务计划程序。
如果想要安排一个程序,以下是需要提供给CScheduledTask的信息:
创建每周重复任务时有一个小问题:如果希望任务在星期一重复,开始日期必须是星期一。同样,对于每月任务,如果希望任务在20号运行,开始日期必须是20号。
CScheduledTask成员函数用于执行所有这些操作,如下所示:
void SetProgram ( LPCTSTR szProgram );
void SetParameters ( LPCTSTR szParams );
void SetStartingDir ( LPCTSTR szDir );
void SetAccountName ( LPCTSTR szAccount );
void SetPassword ( LPCTSTR szPassword );
void SetStartDateTime ( const CTime& timeStart );
void SetStartDateTime ( const SYSTEMTIME& timeStart );
void SetEndDate ( const CTime& timeEnd );
void SetEndDate ( const SYSTEMTIME& timeEnd );
void SetFrequency ( CScheduledTask::ETaskFrequency freq );
void SetComment ( LPCTSTR szComment );
注意,设置开始时间有两个函数,设置结束日期也有两个。这两个重载允许根据代码中使用的格式传递CTime或SYSTEMTIME。
ETaskFrequency是一个枚举,具有以下值:
enum ETaskFrequency
{
freqOnce, freqDaily, freqWeekly, freqMonthly
};
设置所有相关信息后,调用SaveTask()函数:
HRESULT SaveTask ( LPCTSTR szTaskName, BOOL bFailIfExists = FALSE );
如果保存成功,返回值是S_OK。如果在设置必需参数(例如,任务名称、开始日期/时间或频率)之前调用此函数,返回值是E_FAIL。如果任务计划程序COM方法失败,返回的HRESULT是最后一个调用的COM方法返回的错误。在调试版本中,CScheduledTask会显示一个跟踪消息,列出失败的方法。
bFailIfExists参数确定如果给定名称的任务已经存在,SaveTask()是否会退出。默认行为是替换现有任务。
删除任务非常简单 - 只需调用DeleteTask函数:
static HRESULT DeleteTask ( LPCTSTR szTaskName );
请注意,这是一个静态函数,它独立于类中的其他所有内容。这个函数也返回一个HRESULT,类似于SaveTask()。
如果需要清除CScheduledTask对象的内容,请调用Reset函数:
void Reset();
还包含了一些访问器函数,用于返回各种任务参数。它们是:
BOOL GetStartDateTime ( CTime& ) const;
BOOL GetEndDate ( CTime& ) const;
ETaskFrequency GetFrequency() const;
CString GetProgram() const;
CString GetParameters() const;
CString GetStartingDir() const;
CString GetAccountName() const;
CString GetComment() const;
这些函数是为了完整性而存在的,它们很容易编写,并且也为未来的增强提供了起点,例如能够枚举任务计划程序中的现有任务。GetStartDateTime()和GetEndDate()返回一个BOOL,指示相应的日期/时间是否已设置。如果设置了日期/时间,则返回TRUE;如果没有设置,则返回FALSE。GetFrequency()返回特殊值freqUnset,如果没有设置频率。其余函数如果相应的项没有设置,则返回一个空字符串。
请注意,没有GetPassword()函数,因为任务计划程序API不提供检索密码的方法。