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调用来确保获取本地时区的正确时间和日期。