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