【问题标题】:Task Scheduler: Problem attempting to retrieve a task object任务计划程序:尝试检索任务对象时出现问题
【发布时间】:2011-01-15 00:01:11
【问题描述】:

我正在使用/学习 win32 C++ 中的 Windows 任务计划程序。我正在尝试检索任务对象(对于存在的任务),但它不断失败并返回错误 COR_E_FILENOTFOUND 0x80070002 = 任务不存在

你认为哪里出了问题?我知道这个任务的存在是因为我创建了它(它做了它应该做的事情,在指定的时间打开一个应用程序)。

也许我用来检索 ITask 对象的任务名称不正确?我创建的任务的状态(优先级?)是 == 3(如果该信息有帮助的话)。

我用来创建任务的代码与msdn的示例代码完全相同,任务名称为“MyTaskSascha”。

我检索现有任务的代码有什么问题(我相信我试图检索的任务不被视为“正在运行”而是“已调度”,所以可能是问题所在?):

bool RemoveTask( std::string taskName )
{
// Post: 

ITaskScheduler  *taskSched = NULL;
ITask           *task      = NULL;
HRESULT         hr         = S_OK;
HRESULT         taskStatus = NULL;

LPCWSTR wTaskName;
wTaskName = L"MyTestSascha";

/// Initialise COM library & obtain Task Scheduler object

hr = CoInitialize( NULL );

if ( FAILED(hr) )
{
    printf( "Failed to coinitialise hresult \n" );
    return false;
}

hr = CoCreateInstance( CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, 
                       IID_ITaskScheduler, (void**) &taskSched );

if ( FAILED(hr) )
{
    printf( "Failed to create instance \n" );
    CoUninitialize();
    return false;
}

/// Obtain task object

hr = taskSched -> Activate( wTaskName, IID_ITask, (IUnknown**) &task );
taskSched -> Release();

std::cout <<  wTaskName << std::endl;
printf( "%s \n", wTaskName );

if ( FAILED(hr) )
{
    // COR_E_FILENOTFOUND E_INVALIDARG E_OUTOFMEMORY SCHED_E_UNKNOWN_OBJECT_VERSION
    if      ( hr == 0x80070002 ) { std::cout << "The task does not exist \n"; }
    else if ( hr == 0x80000003 ) { std::cout << "The pwszName parameter is not valid \n"; }
    else if ( hr == 0x80070057 ) { std::cout << "A memory allocation failed \n"; }
    else if ( hr == 0x80041313 ) { std::cout << "The task object version is either unsupported or invalid \n"; }
    printf( "Failed retrieving task object %x \n", hr );
    CoUninitialize();
    return false;
}

【问题讨论】:

    标签: winapi scheduled-tasks


    【解决方案1】:

    您正在使用 Task Scheduler 2.0 API 创建任务,但正在尝试使用较旧的 1.0 API 访问它。

    Task Scheduler 及其 COM API 已针对 Windows Vista 重新设计,并且 Task Scheduler 1.0 API 不能用于访问使用新接口的任务(可能是因为它使用了一种非常不同的设计,允许许多新的特征)。您可以通过在使用 MMC 管理单元创建任务时选择“配置用于:Windows Server 2003、Windows XP 或 Windows 2000”来创建可以使用此示例代码访问的 backward compatible task,或者可能通过使用旧 API(不过,我在一个简单的测试应用程序中没有成功这样做)。根文件夹中的任务以这种方式为我工作,带或不带前导反斜杠;子文件夹中的任务似乎根本无法访问。
    如果您对与旧 Windows 版本的兼容性不感兴趣,您可以使用新的 API 访问任务。

    MSDN examples 存在于两个 API 版本中(注意顶部/底部分离),the new features relevant for developers 也列在其中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-28
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2010-09-09
      • 1970-01-01
      • 2012-04-04
      相关资源
      最近更新 更多