【问题标题】:How to get ITimeTrigger interface for a Task Scheduler task?如何获取任务计划程序任务的 ITimeTrigger 接口?
【发布时间】:2015-02-14 02:43:49
【问题描述】:

我正在尝试获取任意 task scheduler 任务的“random delay”值。我想出了以下 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();

我在我知道设置了“随机延迟”的任务上测试上面的代码 sn-p,即我的 Windows 8.1 上的\Microsoft\Windows\TaskScheduler->Regular Maintenance

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

知道我做错了什么吗?

【问题讨论】:

  • 屏幕截图显示您的是IDailyTrigger,而不是ITimeTrigger
  • @IgorTandetnik:欣赏它。我知道这很简单;)

标签: c++ winapi com scheduled-tasks


【解决方案1】:

在Task scheduler中访问Random delay,我们不能直接访问,你必须通过所有接口访问。

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

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

这样你必须为每个触发器做。

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2012-10-23
    • 2017-09-08
    • 2011-07-23
    • 1970-01-01
    • 2019-12-09
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多