C++ 使用ITaskScheduler、ITask接口的计划任务出现问题
下面的代码执行时没有任何错误,但任务并没有执行,我也并没有在控制面板中看到它。请帮忙C++ 使用ITaskScheduler、ITask接口的计划任务出现问题,c++,winapi,com,scheduled-tasks,C++,Winapi,Com,Scheduled Tasks,下面的代码执行时没有任何错误,但任务并没有执行,我也并没有在控制面板中看到它。请帮忙 HRESULT CreateOnceActionTask(const wchar_t* taskName, const wchar_t* programPath, const wchar_t* params) { HRESULT hr = S_OK; CComPtr<ITaskScheduler> taskScheduler; if(FAILED(hr = CoCreate
HRESULT CreateOnceActionTask(const wchar_t* taskName, const wchar_t* programPath, const wchar_t* params)
{
HRESULT hr = S_OK;
CComPtr<ITaskScheduler> taskScheduler;
if(FAILED(hr = CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void**)&taskScheduler)))
ReturnErrorMsg(hr, L"Failed to get IID_ITaskScheduler");
// create task
CComPtr<ITask> task;
if(FAILED(hr = taskScheduler->NewWorkItem(taskName, CLSID_CTask, IID_ITask, (IUnknown**)&task)))
{
//if(FAILED(hr = taskScheduler->Activate(taskName, IID_ITask, (IUnknown**) &task)))
ReturnErrorMsg(hr, L"Failed to create task");
//taskScheduler->Delete(taskName);
//return S_OK;
}
if(FAILED(hr = task->SetApplicationName(programPath)))
ReturnErrorMsg(hr, L"Failed to set SetApplicationName");
if(FAILED(hr = task->SetParameters(params)))
ReturnErrorMsg(hr, L"Failed to set SetParameters");
if(FAILED(hr = task->SetTaskFlags(TASK_FLAG_DELETE_WHEN_DONE)))
ReturnErrorMsg(hr, L"Failed to set task flags");
// save task
CComPtr<IPersistFile> persistTask;
if(FAILED(hr = task->QueryInterface(IID_IPersistFile, (void **)&persistTask)))
ReturnErrorMsg(hr, L"Failed to save task with IPersistFile");
if(FAILED(hr = persistTask->Save(NULL,TRUE)))
ReturnErrorMsg(hr, L"Failed to save task with IPersistFile");
// create trigger
CComPtr<ITaskTrigger> taskTrigger;
CComPtr<IPersistFile> persistTrigger = NULL;
WORD wTrigNumber = 0;
if (FAILED(hr = task->CreateTrigger(&wTrigNumber, &taskTrigger)))
ReturnErrorMsg(hr, L"Failed to createTrigger");
// create trigger description
TASK_TRIGGER triggerStruct = {0};
ZeroMemory ( &triggerStruct, sizeof (TASK_TRIGGER) );
triggerStruct.cbTriggerSize = sizeof (TASK_TRIGGER);
triggerStruct.TriggerType = TASK_TIME_TRIGGER_ONCE;
// 10 minutes from now
COleDateTime oDate = COleDateTime::GetCurrentTime() + COleDateTimeSpan(0, 0, 1, 0);
triggerStruct.wBeginYear = oDate.GetYear();
triggerStruct.wBeginMonth = oDate.GetMonth();
triggerStruct.wBeginDay = oDate.GetDay();
triggerStruct.wStartHour = oDate.GetHour();
triggerStruct.wStartMinute = oDate.GetMinute();
// associate the trigger with the task
if (FAILED(hr = taskTrigger->SetTrigger(&triggerStruct)))
ReturnErrorMsg(hr, L"Failed to set trigger for the task");
if (FAILED(hr = task->QueryInterface(IID_IPersistFile, (void **) &persistTrigger)))
ReturnErrorMsg(hr, L"Failed to get IPersistFile for trigger");
if (FAILED(hr = persistTrigger->Save(NULL, FALSE)))
ReturnErrorMsg(hr, L"Failed to save trigger");
if (FAILED(hr = task->Run()))
ReturnErrorMsg(hr, L"Failed to run task");
return S_OK;
}
HRESULT createOnActionTask(常量wchar\u t*任务名、常量wchar\u t*程序路径、常量wchar\u t*参数)
{
HRESULT hr=S_正常;
CComPtr任务调度器;
if(失败(hr=CoCreateInstance(CLSID_CTaskScheduler,NULL,CLSCTX_INPROC_服务器,IID_ITaskScheduler,(void**)和taskScheduler)))
ReturnErrorMsg(hr,L“无法获取IID_ITaskScheduler”);
//创建任务
CComPtr任务;
if(失败(hr=taskScheduler->NewWorkItem(任务名、CLSID\u CTask、IID\u ITask、(IUnknown**)和任务)))
{
//如果(失败(hr=taskScheduler->Activate(taskName,IID_ITask,(IUnknown**)和task)))
ReturnErrorMsg(hr,L“创建任务失败”);
//任务调度器->删除(任务名称);
//返回S_OK;
}
如果(失败(hr=task->SetApplicationName(programPath)))
ReturnErrorMsg(hr,L“设置SetApplicationName失败”);
如果(失败(hr=任务->设置参数(参数)))
ReturnErrorMsg(hr,L“设置参数失败”);
if(失败(hr=task->SetTaskFlags(task\u FLAG\u完成时删除)))
ReturnErrorMsg(hr,L“无法设置任务标志”);
//保存任务
CComPtr任务;
if(失败(hr=task->QueryInterface(IID_IPersistFile,(void**)和persistask)))
ReturnErrorMsg(hr,L“无法使用IPersistFile保存任务”);
if(失败(hr=persistTask->Save(NULL,TRUE)))
ReturnErrorMsg(hr,L“无法使用IPersistFile保存任务”);
//创建触发器
CComPtr任务触发器;
CComPtr persistTrigger=NULL;
单词wTrigNumber=0;
if(失败(hr=task->CreateTrigger(&wTrigNumber,&taskTrigger)))
ReturnErrorMsg(hr,L“未能创建触发器”);
//创建触发器描述
TASK_TRIGGER triggerStruct={0};
零内存(&triggerStruct,sizeof(TASK_TRIGGER));
triggerStruct.cbTriggerSize=sizeof(任务\触发器);
triggerStruct.TriggerType=任务\时间\触发器\一次;
//10分钟后
COleDateTime oDate=COleDateTime::GetCurrentTime()+COleDateTimeSpan(0,0,1,0);
triggerStruct.wBeginYear=oDate.GetYear();
triggerStruct.wBeginMonth=oDate.GetMonth();
triggerStruct.wBeginDay=oDate.GetDay();
triggerStruct.wStartHour=oDate.GetHour();
triggerStruct.wStartMinute=oDate.GetMinute();
//将触发器与任务关联
如果(失败(hr=taskTrigger->SetTrigger(&triggerStruct)))
ReturnErrorMsg(hr,L“未能为任务设置触发器”);
if(失败(hr=task->QueryInterface(IID_IPersistFile,(void**)和persistrigger)))
ReturnErrorMsg(hr,L“无法获取触发器的IPersistFile”);
if(失败(hr=persistrigger->Save(NULL,FALSE)))
ReturnErrorMsg(hr,L“保存触发器失败”);
如果(失败(hr=task->Run())
ReturnErrorMsg(hr,L“无法运行任务”);
返回S_OK;
}
我使用RunOnce键而不是此codeRunOnce键??你能给我一个链接吗?你可能想检查一下你得到的日期是否正确。我使用Windows的GetLocalTime
api调用来确保获取本地时区的正确时间和日期。