如何获取任务计划程序任务的ITimeTrigger界面?

时间:2015-02-14 02:43:49

标签: c++ winapi com scheduled-tasks

我试图获得" random delay"任意task scheduler任务的值。我想出了以下C ++代码:

//IRegisteredTask* pRegisteredTask for task:
//  Name: "Regular Maintenance"
//  Folder: "\Microsoft\Windows\TaskScheduler"

ITaskDefinition* pTaskDef = NULL;
HRESULT hr = pRegisteredTask->get_Definition(&pTaskDef);
if(SUCCEEDED(hr))
{
    //Get triggers
    ITriggerCollection* pTriggerCol = NULL;
    hr = pTaskDef->get_Triggers(&pTriggerCol);
    if(SUCCEEDED(hr))
    {
        //Get number of triggers
        LONG nTriggerCnt = 0;
        hr = pTriggerCol->get_Count(&nTriggerCnt);
        if(SUCCEEDED(hr))
        {
            //Look through all triggers
            for(LONG t = 0; t < nTriggerCnt; t++)
            {
                ITrigger* pTrigger = NULL;
                hr = pTriggerCol->get_Item(t + 1, &pTrigger);
                if(SUCCEEDED(hr))
                {
                    //Get time trigger interface
                    ITimeTrigger *pTimeTrigger = NULL;
                    hr = pTrigger->QueryInterface(IID_ITimeTrigger, (void**)&pTimeTrigger);
                    if(SUCCEEDED(hr))
                    {
                        BSTR bstrRndDelay = NULL;
                        hr = pTimeTrigger->get_RandomDelay(&bstrRndDelay);
                        if(SUCCEEDED(hr))
                        {
                            //Check random delay
                        }

                        SysFreeString(bstrRndDelay);
                    }
                    else
                    {
                        //0x80004002 (E_NOINTERFACE) error happens here
                    }

                    if(pTimeTrigger)
                        pTimeTrigger->Release();
                }

                if(pTrigger)
                    pTrigger->Release();
            }
        }
    }

    if(pTriggerCol)
        pTriggerCol->Release();
}

if(pTaskDef)
    pTaskDef->Release();

我在上面的代码片段中测试了我知道的任务&#34;随机延迟&#34;在我的Windows 8.1上设置,即\Microsoft\Windows\TaskScheduler - &gt; Regular Maintenance

enter image description here

但由于某种原因,当我尝试获取ITimeTrigger界面时,我收到错误0x80004002E_NOINTERFACE(正如我在上面的代码中所标记的那样。)

知道我做错了什么吗?

1 个答案:

答案 0 :(得分:-1)

要访问任务计划程序中的随机延迟,我们无法直接执行此操作,您必须访问所有接口。

假设我正在使用IDailyTigger或IWeeklyTigger接口,你必须访问随机延迟。

IWeeklyTigger*  lpWeeklyTrigger;
lpWeeklyTrigger->get_RandomDelay(&lcRandomDelay);
IDailyTigger* lpDailyTrigger;
lpDailyTrigger->get_RandomDelay(&lcRandomDelay);

这种方式你必须为每个触发器做。