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 系統類別的實例。 針對要呼叫之方法的每個輸入參數,有一個非系統屬性。 方法提供者會忽略附加至 方法中每個參數的 標識元 限定符,這通常僅供瀏覽器和類似的應用程式使用。

[in] pResponseHandler

不可以是 NULL。 物件接收會接收方法呼叫的結果。 輸出參數會傳送至 IWbemObjectSink::Indicate。 最常見的傳回對像是 __Parameters 系統類別的實例。 如需傳回碼的詳細資訊,請參閱一節。 實作方法提供者時,您應該呼叫 Indicate 以在呼叫 IWbemObjectSink::SetStatus 之前傳回輸出參數資訊,以報告最終狀態。

傳回值

這個方法會傳回 HRESULT ,指出方法呼叫的狀態。 下列清單列出 HRESULT 中包含的值。

失敗時,您可以從 COM 函式 GetErrorInfo 取得任何可用資訊。

其他錯誤會以異步方式回報給 pReponseHandler 參數中提供的物件接收。

如果網路問題造成您失去與 WMI 的遠端連線,也可能傳回 COM 特定的錯誤碼。

備註

單一方法提供者可為許多類別和實例提供方法。 方法提供者必須處理最多三個傳回值。

系統會呼叫 IWbemObjectSink::SetStatus 方法,以指出結果集的結尾。 它也可能呼叫,而不需對 IWbemObjectSink::指出 發生錯誤狀況。

由於回呼可能不會與用戶端所需的相同驗證層級傳回,因此建議您使用半異步而非異步通訊。 如果您需要異步通訊,請參閱 呼叫 方法

傳回值 描述
需要 execMethodAsync () 指出 pInParams 參數所指向之方法的輸入參數是否有效。
叫用的方法 (選擇性) 相依於方法。 傳回值會放在代表 out 參數的 __PARAMETERS 實例的 ReturnValue 屬性中,並透過對 Indicate 的呼叫傳回。
叫用方法輸出參數 (選擇性) 相依於方法。 Out 參數會放在 __PARAMETERS 實例的非系統屬性中,並透過 Indicate 傳回。
 

範例

下列 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)
程式庫 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