无法启动在C ++中创建的任务计划程序

时间:2010-11-30 18:10:24

标签: c++ scheduler

我在C ++中创建了一个调度程序。我已经设置了所有参数,并且任务配置为仅在用户使用提供的用户名登录时运行(通过设置TASK_FLAG_RUN_ONLY_IF_LOGGED_ON标志完成)。

当我尝试运行任务时,我收到状态“无法启动”。现在假设我手动编辑任务属性中的任何属性,然后单击确定任务运行正常。

注意:指定的手动编辑可能是任何内容,例如只在可加密名称的末尾添加空格或用户名。可能是什么问题?

以下是我正在使用的代码:

#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
 // CoCreateInstance 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;
}

2 个答案:

答案 0 :(得分:0)

我认为您需要测试所有返回值,这可能是揭示。我大多怀疑:

 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我得到的印象是你需要先调用SetFlags然后再调用SetAccountInformation。

答案 1 :(得分:0)

我在XP上遇到了同样的问题:状态“无法启动”,手动编辑后一切正常。 解决方案:

  • 转到高级 - &gt;查看日志。并查看失败的原因。
  • 就我而言,“尝试检索指定任务的帐户信息失败”。所以我只需要通过GetUserName获取用户名,然后通过SetAccountInformation进行设置。注意SetAccountInformationSetFlags的顺序并不重要。
  • 出于其他原因,请查看here

可能有一天它会帮助某人。