Планировщик задач: Проблема при попытке получить объект задачи - PullRequest
0 голосов
/ 15 января 2011

Я использую / изучаю планировщик заданий Windows в win32 C ++. Я пытаюсь получить объект задачи (для существующей задачи), но он постоянно завершается ошибкой и возвращает ошибку 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 Ответ

1 голос
/ 03 февраля 2011

Вы создаете задачу с помощью API Task Scheduler 2.0, но пытаетесь получить к ней доступ с использованием более старого API 1.0.

Планировщик задач и его COM-интерфейс были переработаны для Windows Vista и Задачи.API Scheduler 1.0 нельзя использовать для доступа к задачам, использующим новый интерфейс (предположительно, потому что он использует совершенно другой дизайн, который допускает множество новых функций).Вы можете создать обратно совместимую задачу , к которой можно получить доступ, используя этот пример кода, выбрав «Настроить для: Windows Server 2003, Windows XP или Windows 2000» при создании задачи с помощью оснастки MMC, илипо-видимому, создав его с помощью старого API (однако мне не удалось сделать это в простом тестовом приложении).Задачи в корневой папке работают для меня таким образом с или без обратной косой черты;задачи в подпапках, кажется, вообще недоступны.
Если вас не интересует совместимость со старыми версиями Windows, вы можете просто получить доступ к задаче с помощью нового API.

MSDNпримеры существуют для обеих версий API (обратите внимание на разделение сверху / снизу), и там также перечислены новые функции, относящиеся к разработчикам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...