任务计划程序:尝试检索任务对象时出现问题

时间:2011-01-15 00:01:12

标签: winapi scheduled-tasks

我在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;
}

1 个答案:

答案 0 :(得分:1)

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

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

两个API版本都存在

MSDN examples(注意顶部/底部分隔),the new features relevant for developers也列在那里。