在C++;无法启动 我在C++中创建了一个调度器。我已经设置了所有的参数,并且任务被配置为只在用户登录时提供了用户名(通过设置TaskJavaRunRunixLyIfLoGGEdEdOn on标志来完成)。

在C++;无法启动 我在C++中创建了一个调度器。我已经设置了所有的参数,并且任务被配置为只在用户登录时提供了用户名(通过设置TaskJavaRunRunixLyIfLoGGEdEdOn on标志来完成)。,c++,scheduler,C++,Scheduler,当我尝试运行该任务时,我得到一个状态“无法启动”。现在,假设我手动编辑任务属性中的任何属性,然后单击OK,任务运行正常 注意:指定的手动编辑可以是任何内容,例如仅在可执行名称或用户名的末尾添加空格。有什么问题吗 下面是我正在使用的代码: #include <windows.h> #include <initguid.h> #include <ole2.h> #include <mstask.h> #include <msterr.h>

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

注意:指定的手动编辑可以是任何内容,例如仅在可执行名称或用户名的末尾添加空格。有什么问题吗

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

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Mstask.lib”)
#pragma注释(lib,“ole32.lib”)
int main(int argc,字符**argv)
{
HRESULT hr=S_正常;
ITASK*凹坑;
///////////////////////////////////////////////////////////////////
//调用CoInitialize初始化COM库,然后
//CoCreateInstance以获取任务计划程序对象。
///////////////////////////////////////////////////////////////////
hr=协同初始化(空);
如果(成功(hr))
{
hr=CoCreateInstance(CLSID_CTaskScheduler,
无效的
CLSCTX_INPROC_服务器,
IID_Itask调度员,
(空隙**)和凹坑);
如果(失败(小时))
{
coninitialize();
返回1;
}
}
其他的
{
返回1;
}
LPCWSTR pwszTaskName;
ITask*皮托;
pwszTaskName=L“TestTask”;
hr=pITS->NewWorkItem(pwszTaskName,
CLSID_CTask,
IID_ITask,
(IUnknown**)和pITask);
如果(失败(小时))
{
wprintf(L)调用ITaskScheduler::NewWorkItem失败:);
wprintf(L“error=0x%x\n”,hr);
coninitialize();
返回1;
}
LPCWSTR pwszApplicationName=L“C:\\windows\\notepad.exe”;
hr=pITask->SetApplicationName(pwszApplicationName);
如果(失败(小时))
{
wprintf(L“调用ITask::SetApplicationName:”失败);
wprintf(L“error=0x%x\n”,hr);
坑->释放();
pITask->Release();
coninitialize();
返回1;
}
pITask->SetAccountInformation(L“用户名”,空);
pITask->SetFlags(只有登录时才运行任务标志);
任务->设置工作目录(L“C:\\windows”);
ITaskTrigger*pITaskTrigger;
单词piNewTrigger;
hr=pITask->CreateTrigger和piNewTrigger,
&pITaskTrigger);
如果(失败(小时))
{
wprintf(L“调用ITask::CreatTrigger失败:”);
wprintf(L“error=0x%x\n”,hr);
pITask->Release();
coninitialize();
返回1;
}
pITS->AddWorkItem(pwszTaskName,pITask);
pITS->Release();//释放调度程序
hr=pITask->Run();
如果(失败(小时))
{
wprintf(L“调用ITask::Run失败,错误=0x%x\n”,hr);
pITask->Release();
coninitialize();
返回1;
}
pITask->Release();
coninitialize();
_getch();
返回0;
}

我认为您需要测试所有返回值,这可能很有启发性。我最怀疑的是:

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

阅读时,我觉得您需要先调用SetFlags,然后调用SetAccountInformation。

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

  • 转到高级->查看日志。看看失败的原因
  • 在我的例子中,出现了“尝试检索指定任务的帐户信息失败”。所以我只需要通过
    GetUserName
    获取用户名,然后通过
    SetAccountInformation
    进行设置。注意
    SetAccountInformation
    SetFlags
    的顺序并不重要
  • 看看其他原因

也许有一天它会对某人有所帮助。

你根本没有调试过吗?看来您正在向我们倾销大量代码,以便为您调试。您应该自己开始调试过程。调试。我愿意调试你的代码墙,每10分钟500美元。很抱歉代码太长。但我认为代码是必要的。代码运行良好。我想我缺少调度程序的一些属性。如果有人遇到过这个问题,请给出建议。谢谢你的回复丹尼。当我试图通过调用pIPersistFile->save(NULL,TRUE)方法来保存触发器时,它抛出了一个错误。错误是:无法建立指定帐户的任务计划程序的存在。我如何解决这个问题?