65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (10投票s)

1999年11月30日

5分钟阅读

viewsIcon

145940

downloadIcon

3729

  • 下载演示项目 - 23 Kb
  • 下载演示文件 - 9 Kb
  • Sample Image

    概述

    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 上运行。
    © . All rights reserved.