使用 Microsoft 任务计划程序的基类






4.95/5 (10投票s)
1999年11月30日
5分钟阅读

145940

3729
概述
Microsoft 为 IE 4、IE 5、Win 98 和 NT 5 开发了一个功能齐全的计划程序。从所有可用的任务选项(三个属性页和一个“高级”对话框)来看,您可能会认为编程计划程序是一项艰巨的任务。您是对的。我开发了 CScheduledTask 类,以帮助您创建非常简单的任务并了解使用计划程序的基础知识。
此类仍有很大的改进空间。这是我特意为之——创建一个实现计划程序所有功能的类,相当于重写计划程序 UI,我真的不想(免费;))。目前,CScheduledTask 可以创建和删除计划程序中的事件。任务可以具有简单的计划,即一次性、每日、每周或每月。
CScheduledTask 是使用 MSVC 6.0 在 Win 98 上编写的。它应该在 Unicode 下正常工作,尽管我没有测试过。我确实使用了一些 6.0 特定的函数,例如 CTime::GetAsSystemTime() 和 CString::Delete(),因此为了使用 MSVC 5.0 进行编译,您需要将这些部分转换回使用 MFC 4.2 函数。您还需要安装 INetSDK 或 Platform SDK,因为您需要链接 MSTASK.LIB 来获取计划程序的 GUID 并包含 MSTASK.H 来获取接口。
请注意,此类**不**与 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() 返回一个布尔值,指示相应的日期/时间是否已设置。如果日期/时间已设置,则返回 TRUE,否则返回 FALSE。GetFrequency() 返回特殊值 freqUnset,表示未设置频率。其余函数在相应项未设置时返回空字符串。请注意,没有 GetPassword() 函数,因为任务计划程序 API 不提供检索密码的方法。
更新
1999 年 4 月 18 日:版本 1.1 进行了以下更改
- 修复了针对 Unicode 进行编译时的一些编译错误。感谢 Chris Maunder 提供修复!
- 修复了 SaveTask() 以正确检查现有任务。此更改是必要的,因为我曾尝试绕过 IE 4 中的一个错误,但该错误在 IE 5 中已修复,导致我的代码在 IE 5 上运行时出现问题。
- 添加了一个#pragma以自动链接 mstask.lib,这样您就不必在应用程序的项目设置中记住这样做。
- 在 CoCreateInstance() 调用后添加了一个检查,以查看错误是否为 REGDB_E_CLASSNOTREG。如果是,我将显示一个更友好的跟踪消息,解释您没有安装计划程序。
1999 年 11 月 27 日:版本 1.2 进行了以下更改
- 添加了为任务设置帐户和密码的函数,以便任务可以在 NT 上运行。