开发者

Task scheduler created in C++ could not be started

I created an scheduler in C++.I have set all the parameters and the task is configured to run only when the user is logged on with the user name provided(Done by setting the TASK_FLAG_RUN_ONLY_IF_LOGGED_ON flag).

When I try to run the task I get a status "Could not start". Now suppose I manually edit any property in task property and click on OK the task runs fine.

Note:The manual edit specified may be anything, like just adding a space at the end of the excecutable name or the user name. What may be the problem?

Below is the code i am using:

#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <wchar.h>
#include<stdio.h>
#include<conio.h>

#pragma comment(lib, "Mstask.lib")
#pragma comment(lib, "ole32.lib")

int main(int argc, char **argv)
{
 HRESULT hr = S_OK;
 ITaskScheduler *pITS;

 ///////////////////////////////////////////////////////////////////
 // Call CoInitialize to initialize the COM library and then
 // CoCreateInst开发者_C百科ance to get the Task Scheduler object.
 ///////////////////////////////////////////////////////////////////
 hr = CoInitialize(NULL);
 if (SUCCEEDED(hr))
 {
  hr = CoCreateInstance(CLSID_CTaskScheduler,
   NULL,
  CLSCTX_INPROC_SERVER,
   IID_ITaskScheduler,
   (void **) &pITS);
   if (FAILED(hr))
  {
   CoUninitialize();
   return 1;
   }
  }
    else
 {
  return 1;
 }

 LPCWSTR pwszTaskName;
 ITask *pITask;
  pwszTaskName = L"TestTask";

 hr = pITS->NewWorkItem(pwszTaskName,
  CLSID_CTask,
  IID_ITask,
 (IUnknown**)&pITask);

  if (FAILED(hr))
 {
  wprintf(L"Failed calling ITaskScheduler::NewWorkItem: ");
  wprintf(L"error = 0x%x\n",hr);
  CoUninitialize();
   return 1;
  }


  LPCWSTR pwszApplicationName = L"C:\\windows\\notepad.exe";

  hr = pITask->SetApplicationName(pwszApplicationName);

  if (FAILED(hr))
 {
  wprintf(L"Failed calling ITask::SetApplicationName: ");
  wprintf(L"error = 0x%x\n",hr);
  pITS->Release();
  pITask->Release();
  CoUninitialize();
  return 1;
 }

  pITask->SetAccountInformation(L"USERNAME", NULL);
  pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
  pITask->SetWorkingDirectory(L"C:\\windows");


  ITaskTrigger *pITaskTrigger;
  WORD piNewTrigger;
  hr = pITask->CreateTrigger(&piNewTrigger,
                         &pITaskTrigger);
  if (FAILED(hr))
  {
    wprintf(L"Failed calling ITask::CreatTrigger: ");
    wprintf(L"error = 0x%x\n",hr);
    pITask->Release();
    CoUninitialize();
    return 1;
  }

  pITS->AddWorkItem(pwszTaskName, pITask);
  pITS->Release(); // Release sceduler

   hr = pITask->Run();
  if (FAILED(hr))
  {
    wprintf(L"Failed calling ITask::Run, error = 0x%x\n",hr);
    pITask->Release();
   CoUninitialize();
   return 1;
  }

   pITask->Release();      
  CoUninitialize();
    _getch();
  return 0;
}


I think you need to test all return values, that could be revealing. I'm mostly suspicious about:

 pITask->SetAccountInformation(L"USERNAME", NULL);
 pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);

Readinig http://msdn.microsoft.com/en-us/library/aa381276(VS.85).aspx I got the impression that you need to call SetFlags first and then SetAccountInformation.


I've had the same problem on XP: status "Could not start" and all ok after manual editing. Solution:

  • Go to Advanced -> View Log. And see the reason for the fail.
  • In my case there was "The attempt to retrieve account information for the specified task failed". So I've just needed to get user name via GetUserName and set it via SetAccountInformation. Note order of SetAccountInformation and SetFlags doesn't matter.
  • Take a look here for other reasons.

May be it will help someone someday.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜