c++ - 如何在任务计划程序中显示所有任务

标签 c++ windows com msdn taskscheduler

我想使用COM 库 显示Task Scheduler 下的所有任务。

我尝试使用 learn.microsoft.com 上使用 COM 对象的程序。 但是它没有显示所有 60 个任务,而是只显示 12 个任务

//Get the pointer to the root task folder.
ITaskFolder *pRootFolder = NULL;
hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);

pService->Release();
if (FAILED(hr))
{
    printf("Cannot get Root Folder pointer: %x", hr);
    CoUninitialize();
    return 1;
}

//  -------------------------------------------------------
//  Get the registered tasks in the folder.
IRegisteredTaskCollection* pTaskCollection = NULL;
hr = pRootFolder->GetTasks(NULL, &pTaskCollection);

pRootFolder->Release();
if (FAILED(hr))
{
    printf("Cannot get the registered tasks.: %x", hr);
    CoUninitialize();
    return 1;
}

LONG numTasks = 0;
hr = pTaskCollection->get_Count(&numTasks);


TASK_STATE taskState;

for (LONG i = 0; i < numTasks; i++)
{
    IRegisteredTask* pRegisteredTask = NULL;
hr = pTaskCollection->get_Item(_variant_t(i + 1), &pRegisteredTask);

    if (SUCCEEDED(hr))
    {
        BSTR taskName = NULL;
        hr = pRegisteredTask->get_Name(&taskName);
        if (SUCCEEDED(hr))
        {
            printf("\nTask Name: %S", taskName);
            SysFreeString(taskName);

            hr = pRegisteredTask->get_State(&taskState);
            if (SUCCEEDED(hr))
                printf("\n\tState: %d", taskState);

我希望输出显示所有任务,但它只显示选定数量的任务。

https://learn.microsoft.com/en-us/windows/desktop/taskschd/displaying-task-names-and-state--c---

这是我用于程序的链接

最佳答案

这是一个示例控制台应用程序代码,它将递归显示所有任务,但正如我在评论中所说,输出将取决于您是否以管理员身份运行它。

// include task scheduler lib from code
#pragma comment(lib, "taskschd.lib")

// some useful macros
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
#define HRCHECK(__expr) {hr=(__expr);if(FAILED(hr)){wprintf(L"FAILURE 0x%08X (%i)\n\tline: %u file: '%s'\n\texpr: '" WIDEN(#__expr) L"'\n",hr, hr, __LINE__,__WFILE__);goto cleanup;}}
#define RELEASE(__p) {if(__p!=nullptr){__p->Release();__p=nullptr;}}
#define STARTUP HRESULT hr=S_OK;
#define CLEANUP {cleanup:return hr;}

// forward declaration
HRESULT DumpFolder(ITaskFolder *fld);

int main()
{
  STARTUP;

  CoInitialize(NULL);
  {
    CComPtr<ITaskService> svc;
    CComPtr<ITaskFolder> fld;
    HRCHECK(svc.CoCreateInstance(CLSID_TaskScheduler));
    HRCHECK(svc->Connect(CComVariant(), CComVariant(), CComVariant(), CComVariant()));
    HRCHECK(svc->GetFolder(CComBSTR(L"\\"), &fld));
    HRCHECK(DumpFolder(fld));
  }

  CoUninitialize();
  CLEANUP;
}

HRESULT DumpFolder(ITaskFolder *fld)
{
  STARTUP;
  CComPtr<IRegisteredTaskCollection> tasks;
  CComPtr<ITaskFolderCollection> children;
  LONG count;

  HRCHECK(fld->GetTasks(TASK_ENUM_HIDDEN, &tasks));
  HRCHECK(tasks->get_Count(&count));

  // dump out tasks
  for (LONG i = 1; i < (count + 1); i++)
  {
    CComPtr<IRegisteredTask> task;
    CComBSTR name;
    HRCHECK(tasks->get_Item(CComVariant(i), &task));
    HRCHECK(task->get_Name(&name));
    wprintf(L"name:'%s'\n", name.m_str);
  }

  // dump out sub folder
  HRCHECK(fld->GetFolders(0, &children));
  HRCHECK(children->get_Count(&count));

  for (LONG i = 1; i < (count + 1); i++)
  {
    CComPtr<ITaskFolder> child;
    HRCHECK(children->get_Item(CComVariant(i), &child));

    // go recursive
    HRCHECK(DumpFolder(child));
  }

  CLEANUP;
}

关于c++ - 如何在任务计划程序中显示所有任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54571074/

相关文章:

windows - COM 服务器是否必须为 [out] 参数调用 SysFreeString()?

c# - 如何处理 AccessViolationException

c++ - Windows 线程 sleep 并从另一个线程唤醒

c++ - 如何使用指定的 gcc 编译 Armadillo 库?

c++ - 无法使用 cmake 使 QPrinter 链接

html - 如何使用PowerShell在新窗口中引用框架中的内容?

com - 尽管声明保持相同,但没有二进制兼容性

c++ - 创建用于创建和打印 vector 的 C++ 类对象

c++ - 是否有任何方法可以将具有 O(n) 复杂度的矩阵相乘?

android - 英特尔在 Windows 操作系统上与 AMD 等效的 HAXM