【问题标题】:Windows Task Scheduler: IAction.QueryInterface() returns an error I cannot find a definition forWindows 任务计划程序:IAction.QueryInterface() 返回错误我找不到定义
【发布时间】:2011-01-13 00:47:36
【问题描述】:

我正在尝试使用 C++ win32 安排任务(在特定时间打开 .exe)。但是在某个特定点我遇到了一个错误,我已经搜索并搜索以尝试并找到此错误的定义,但我找不到它?

你知道这个错误是什么意思吗:十六进制:80004003 十进制:2147500035

我不会发布整个函数,因为它相当长(除非您可能需要它来确定错误上下文?)。

我正在使用的代码(导致错误)如下:

//  QI for the executable task pointer.
hr = action -> QueryInterface( IID_IExecAction, (void**) execAction );
action -> Release();

if( FAILED(hr) )
{
    printf("QueryInterface call failed for IExecAction: %x %X %u \n", hr, hr, hr );
    rootFolder -> Release();
    task -> Release();
    CoUninitialize();
    return false;
}

输出为:QueryInterface call failed for IExecAction: 80004003 80004003 2147500035

【问题讨论】:

    标签: c++ winapi com scheduled-tasks


    【解决方案1】:

    0x80004003 是一个“无效指针”错误,又名E_POINTER

    我假设execAction 的声明类似于:

    IExecAction* execAction = NULL;
    

    但是,QueryInterface 需要一个指向接口指针的指针。换句话说,您传递了一个存储位置来放置IUnknown*...,或者,在这种特定情况下,是IExecAction*

    所以,您需要传递execAction地址,这样QueryInterface 才能将接口指针返回给您。如:

    hr = action -> QueryInterface( IID_IExecAction, (void**) &execAction );
    

    我认为这是正在发生的事情,因为将指针值初始化为 NULL 是一种常见的编码实践,QueryInterface is documented 在第二个参数为 NULL 时返回 E_POINTER。如果没有,请使用execAction 的声明更新您的问题。

    【讨论】:

    • 如果您能展示如何将hr 分解为它的组件,这个答案将是完美的。
    • 在这种情况下会有什么帮助?在我与 COM 合作的这些年里,我想我可能不得不这样做两次。
    • 谢谢 :),它成功了 我现在可以安排我的任务了.) 有吗?
    • 没问题。如果您在网站上得到解决问题的答案,您可以单击它旁边的复选标记以“接受”它。至于教程,很多有趣的东西来自 COM 本身,这是一个疯狂的复杂系统。 (您的问题实际上是 COM 的一般问题,而不是特定于任务调度程序。)我会先看一个 COM 教程。不过,我自己也不知道有什么好的。我对任务调度程序 API 几乎一无所知,抱歉。
    • 不知道您是否尝试过 MSDN 文档:msdn.microsoft.com/en-us/library/aa446802(v=vs.85).aspx -- 有时概述部分可能会有所帮助。
    猜你喜欢
    • 2018-01-11
    • 2021-07-08
    • 1970-01-01
    • 2023-03-13
    • 2012-10-09
    • 2012-03-26
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多