勇芳软件工作室.汉化:  Windows Management Instrumentation > COM API for WMI > Interfaces > IWbemServices >

ExecMethodAsync Method

Previous pageReturn to chapter overviewNext page

描述

 

IWbemServices.ExecMethodAsync方法异步执行由CIM对象导出的方法。该呼叫立即返回到客户端,而入站参数被转发到执行它的适当的提供者。信息和状态通过提供的对象接收器返回给呼叫者。

 

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

 

C++ 语法

 

HRESULT ExecMethodAsync(

[in]  const BSTR strObjectPath,

[in]  const BSTR strMethodName,

[in]  LONG lFlags,

[in]  IWbemContext *pCtx,

[in]  IWbemClassObject *pInParams,

[in]  IWbemObjectSink *pResponseHandler

);

 

PowerBASIC 语法

 

METHOD ExecMethodAsync ( _

BYVAL strObjectPath AS DWORD, _

BYVAL strMethodName AS DWORD, _

BYVAL lFlags AS LONG, _

BYVAL pCtx AS IWbemContext, _

BYVAL pInParams AS IWbemClassObject, _

BYVAL pResponseHandler AS IWbemObjectSink _

) AS LONG

 

参数

 

strObjectPath

 

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

 

strMethodName

 

对象的方法名称。

 

lFlags

 

WBEM_FLAG_SEND_STATUS向Windows Management注册通过客户端实施IWbemObjectSink.SetStatus接收中间状态报告的请求。提供商实施必须支持该标志的中间状态报告来改变行为。

 

pCtx

 

通常为NULL;否则,这是指向可以由执行方法的提供者使用的IWbemContext对象的指针。必须在相关提供者的文档中指定上下文对象中的值。有关此参数的更多信息,请参阅拨打电话给WMI.

 

pInParams

 

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

 

pResponseHandler

 

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

 

返回值

 

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

 

失败后,您可以从COM函数GetErrorInfo获取任何可用的信息。

 

其他错误与pReponseHandler参数中提供的对象接收端异步报告。

 

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

 

退货代码

描述

WBEM_E_FAILED

这表示其他未指定的错误。

WBEM_E_INVALID_METHOD_PARAMETERS

此错误是由以下两个原因之一造成的:

 

·所提供的pInParams对象由提供者确定为无效。
·strObjPath参数指定了一个没有方法[static]限定符的类。

WBEM_E_INVALID_PARAMETER

指定了无效参数。

WBEM_E_METHOD_DISABLED

试图执行标记为[disabled]的方法。

WBEM_E_METHOD_NOT_IMPLEMENTED

试图在任何相关类中执行未标记实施限定词的方法。

WBEM_E_OUT_OF_MEMORY

没有足够的内存来完成操作。

WBEM_E_SHUTTING_DOWN

Windows管理服务可能已停止并重新启动。需要新的电话ConnectServer.

WBEM_E_TRANSPORT_FAILURE

这表示当前进程和WMI之间的远程过程调用(RPC)链接失败。

WBEM_E_ACCESS_DENIED

当前用户未被授权执行该方法。

WBEM_S_NO_ERROR

通话成功。

 

示例代码

 

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

 

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;

}

 

备注

 

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

 

调用IWbemObjectSink.SetStatus方法来指示结果集的结束。如果发生错误条件,也可以调用IWbemObjectSink.Indicate的中间调用。

 

因为回调可能不会以与客户端所需的相同的身份验证级别返回,所以建议您使用半异步而不是异步通信。如果需要异步通信,请参阅调用方法.

 

返回值

描述

ExecMethodAsync(必填)

指示pInParams参数指向的方法的输入参数是否有效。

调用方法(可选)

取决于方法。返回值位于__PARAMETERS实例的ReturnValue属性中,表示out参数,并通过调用表明返回。

调用方法输出参数(可选)

取决于方法。输出参数放置在__PARAMETERS实例的非系统属性中,并通过表明返回。

 

要求

 

客户

需要Windows Vista,Windows XP,Windows 2000 Professional,Windows NT Workstation 4.0 SP4及更高版本,Windows Me,Windows 98或Windows 95。

服务器

需要Windows Server 2008,Windows Server 2003,Windows 2000 Server或Windows NT Server 4.0 SP4及更高版本。

在Wbemcli.inc中声明。

DLL

需要Fastprox.dll。

需要Esscli.dll。

需要Framedyn.dll。

需要Ntevt.dll。

需要Stdprov.dll。

需要Viewprov.dll。

需要Wbemcomn.dll。

需要Wbemcore.dll。

需要Wbemess.dll。

需要Wbemsvc.dll。

需要Wmipicmp.dll。

需要Wmidcprv.dll。

需要Wmipjobj.dll。

需要Wmiprvsd.dll。