IWbemServices::ExecMethodAsync 方法 (wbemcli.h)

IWbemServices::ExecMethodAsync 方法异步执行由 CIM 对象导出的方法。 调用会立即返回到客户端,同时将入站参数转发到执行该调用的相应提供程序。 信息和状态通过提供的对象接收器返回到调用方。

方法不是由 Windows 管理直接实现的,而是由方法提供程序导出的。 对于任何给定的 CIM 类,可用方法及其参数是相关提供程序文档的一部分。

语法

HRESULT ExecMethodAsync(
  [in] const BSTR       strObjectPath,
  [in] const BSTR       strMethodName,
  [in] long             lFlags,
  [in] IWbemContext     *pCtx,
  [in] IWbemClassObject *pInParams,
  [in] IWbemObjectSink  *pResponseHandler
);

参数

[in] strObjectPath

包含要为其执行方法的对象的对象路径的有效 BSTR。 可以使用类名或实例的对象路径调用静态方法。 方法提供程序可以分析对象路径参数,以确定包含方法定义的类和实例。

[in] strMethodName

对象的方法的名称。

[in] lFlags

WBEM_FLAG_SEND_STATUS 向 Windows 管理注册请求,以通过 IWbemObjectSink::SetStatus 的客户端实现接收中间状态报告。 提供程序实现必须支持此标志的中间状态报告才能更改行为。 请注意,此处不能使用 WBEM_FLAG_USE_AMENDED_QUALIFIERS 标志。

[in] pCtx

通常 为 NULL;否则,这是指向 IWbemContext 对象的指针,执行方法的提供程序可以使用该对象。 上下文对象中的值必须在相关提供程序的文档中指定。 有关此参数的详细信息,请参阅 调用 WMI

[in] pInParams

如果执行方法不需要任何入站参数,可为 NULL 。 否则,这指向一个 IWbemClassObject 对象,该对象包含充当方法执行的入站参数的属性。 对象的内容特定于方法,并且是有关提供程序的规范的一部分。 但是,最常见的对象是 __Parameters 系统类的实例。 对于要调用的方法的每个输入参数,都有一个非系统属性。 方法提供程序忽略附加到方法中每个参数的 ID 限定符,这些限定符通常仅由浏览器和类似应用程序使用。

[in] pResponseHandler

不能为 NULL。 对象接收器接收方法调用的结果。 出站参数将发送到 IWbemObjectSink::Indicate。 最常见的返回对象是 __Parameters 系统类的实例。 有关返回代码的详细信息,请参阅“备注”部分。 实现方法提供程序时,在调用 IWbemObjectSink::SetStatus 报告最终状态之前,应调用指示以返回输出参数信息。

返回值

此方法返回指示方法调用状态的 HRESULT。 以下列表列出了 HRESULT 中包含的值。

如果失败,可以从 COM 函数 GetErrorInfo 获取任何可用信息。

其他错误以异步方式报告给 pReponseHandler 参数中提供的对象接收器。

如果网络问题导致你失去与 WMI 的远程连接,也可能会返回特定于 COM 的错误代码。

注解

单个方法提供程序可以为许多类和实例提供方法。 方法提供程序必须处理最多三个返回值。

调用 IWbemObjectSink::SetStatus 方法以指示结果集的结束。 也可以调用它,而无需对 IWbemObjectSink::指示 是否发生错误条件。

由于回调可能不会在客户端要求的相同身份验证级别返回,因此建议使用半同步通信而不是异步通信。 如果需要异步通信,请参阅 调用方法

返回值 说明
需要 execMethodAsync () 指示 pInParams 参数指向的方法的输入参数是否有效。
调用的方法 (可选) 依赖于 方法。 返回值放置在表示 out 参数的 __PARAMETERS 实例的 ReturnValue 属性中,并通过调用指示返回。
调用的方法输出参数 (可选) 依赖于 方法。 out 参数放置在 __PARAMETERS 实例的非系统属性中,并通过 指示返回。
 

示例

以下 C++ 示例演示如何为 TestMeth 类的 Echo 方法实现 IWbemServices::ExecMethodAsync 方法。 TestMeth 类支持具有一个输入参数和一个输出参数并返回无符号 32 位整数的方法。 实现假定只有一个名为 Echo 的方法和一个包含它的类。 为简洁起见,没有错误检查或对象路径分析。

STDMETHODIMP CMyMethodProvider::ExecMethodAsync(BSTR ObjectPath, 
    BSTR MethodName, long lFlags, IWbemContext* pCtx, 
    IWbemClassObject* pInParams, IWbemObjectSink* pResultSink)
{
    HRESULT hr;
    IWbemClassObject * pClass = NULL;
    IWbemClassObject * pOutClass = NULL;
    IWbemClassObject* pOutParams;

    // Allocate some BSTRs.

    BSTR ClassName = SysAllocString(L"TestMeth");    
    BSTR InputArgName = SysAllocString(L"sInArg");
    BSTR OutputArgName = SysAllocString(L"sOutArg");
    BSTR retValName = SysAllocString(L"ReturnValue");

    // Get the class object; this is hard-coded and matches the class
    // in the MOF.  A more sophisticated example would parse 
    // ObjectPath to determine the class and possibly the instance.
    // The m_pWbemSvcs pointer is of type IWbemServices*
    hr = m_pWbemSvcs->GetObject(ClassName, 0, pCtx, &pClass, NULL);

    // This method returns values, and so creates an instance of the
    // output argument class.

    hr = pClass->GetMethod(MethodName, 0, NULL, &pOutClass);
    pOutClass->SpawnInstance(0, &pOutParams);

    // Copy the input argument into the output object.

    VARIANT var;
    VariantInit(&var);

    // Get the input argument.
    pInParams->Get(InputArgName, 0, &var, NULL, NULL);   

    // Put it into the output object.
    pOutParams->Put(OutputArgName , 0, &var, 0);      

    long lLen = wcslen(var.bstrVal);
    VariantClear(&var);
    var.vt = VT_I4;
    var.lVal = lLen;
    // Special name for the return value.
    pOutParams->Put(retValName , 0, &var, 0); 

    // Send the output object back to the client by the sink. Then 
    // release the pointers and free the strings.

    hr = pResultSink->Indicate(1, &pOutParams);
    pOutParams->Release();
    pOutClass->Release();
    pClass->Release();
    SysFreeString(ClassName);
    SysFreeString(InputArgName);
    SysFreeString(OutputArgName);
    SysFreeString(retValName);
 
    // All done; now set the status.

    hr = pResultSink->SetStatus(0,WBEM_S_NO_ERROR,NULL,NULL);
    return WBEM_S_NO_ERROR;
}

要求

要求
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 wbemcli.h (包括 Wbemidl.h)
Library Wbemuuid.lib
DLL Fastprox.dll;Esscli.dll;FrameDyn.dll;FrameDynOS.dll;Ntevt.dll;Stdprov.dll;Viewprov.dll;Wbemcomn.dll;Wbemcore.dll;Wbemess.dll;Wbemsvc.dll;Wmipicmp.dll;Wmidcprv.dll;Wmipjobj.dll;Wmiprvsd.dll

另请参阅

调用方法

IWbemCallResult::GetResultObject

IWbemServices

IWbemServices::ExecMethodAsync