【发布时间】: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 接口时,我收到错误0x80004002 或E_NOINTERFACE(正如我在上面的代码中标记的那样。)
知道我做错了什么吗?
【问题讨论】:
-
屏幕截图显示您的是
IDailyTrigger,而不是ITimeTrigger。 -
@IgorTandetnik:欣赏它。我知道这很简单;)
标签: c++ winapi com scheduled-tasks