任务计划程序开发指南

在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的信息:

  • 程序名称:程序的完整路径(必需)。
  • 参数:想要传递给程序的任何命令行参数(可选)。
  • 起始目录:程序的起始目录(可选)。
  • 账户和密码:任务将运行的账户及其密码(仅限NT必需)。
  • 开始日期和时间:一次性任务将运行的日期和时间,或重复任务的开始日期和时间(必需)。
  • 结束日期:重复任务将运行的最后一天(可选,一次性任务不适用)。如果重复任务没有设置这个,任务将无限期重复。
  • 频率:一次性、每天、每周或每月(必需)。
  • 注释:在任务计划程序UI的任务属性页中显示的字符串(可选)。

创建每周重复任务时有一个小问题:如果希望任务在星期一重复,开始日期必须是星期一。同样,对于每月任务,如果希望任务在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不提供检索密码的方法。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485