IWbemServices::GetObjectAsync 方法 (wbemcli.h)

IWbemServices::GetObjectAsync 方法會根據其路徑擷取物件,也就是類別定義或實例。 這類似於 IWbemServices::GetObject ,不同之處在於呼叫會立即傳回,並將物件提供給提供的物件接收。

目前,這個方法只會從與 IWbemServices 指標相關聯的命名空間擷取物件。

語法

HRESULT GetObjectAsync(
  [in] const BSTR      strObjectPath,
  [in] long            lFlags,
  [in] IWbemContext    *pCtx,
  [in] IWbemObjectSink *pResponseHandler
);

參數

[in] strObjectPath

要擷取的物件路徑。 對於實例提供者, StrObjectPath 的格式如下:

  • Namespace:Class.Key = “Value”
  • Namespace:Class = “Value”
  • Namespace:Class.Key = “Value”, Key2 = “Value2”
在類別為選擇性之前指定命名空間。 沒有命名空間的物件路徑會參考目前命名空間中的實例。 如有必要,您可以將單引號字元 ( 的 ) 取代為雙引號字元 (“) 來分隔字串屬性類型的開頭和結尾。

如果這是 NULL,則會傳回空物件,該物件可能會成為新的類別。 如需詳細資訊,請參閱 建立類別

[in] lFlags

下列旗標會影響這個方法的行為。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

如果設定此旗標,WMI 會擷取儲存在目前聯機地區設定之當地語系化命名空間中的修改限定符。 如果未設定,只會擷取儲存在立即命名空間中的限定符。

WBEM_FLAG_DIRECT_READ

此旗標會導致直接存取指定之類別的提供者,而不需考慮其父類別或子類別。

WBEM_FLAG_SEND_STATUS

透過用戶端的 IWbemObjectSink::SetStatus 實作來註冊接收中繼狀態報告的要求。 提供者實作必須支援此旗標的中繼狀態報告,才能變更行為。

[in] pCtx

通常 為 NULL。 否則,這是 IWbemContext 物件的指標,可供產生要求的類別或實例的提供者使用。 內容物件中的值必須在有問題的提供者檔中指定。 如需此參數的詳細資訊,請參閱 呼叫 WMI

[in] pResponseHandler

呼叫端 實作 IWbemObjectSink 的指標。 這個處理程式會透過 IWbemObjectSink::Indicate 方法取得要求的物件。 pObjParam 參數包含 物件。 如果傳回任何錯誤碼,則不會使用提供的 IWbemObjectSink 指標。 如果 傳回WBEM_S_NO_ERROR ,則會呼叫使用者的 IWbemObjectSink 實作來指出作業的結果。 Windows 管理只會在 傳回WBEM_S_NO_ERROR 的情況下呼叫 AddRef 至指標。 如果錯誤碼傳回,則參考計數會與輸入時相同。 如需此參數的詳細資訊,請參閱 呼叫方法

傳回值

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

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

如果網路問題造成您遺失與 Windows 管理的遠端連線,也可以傳回 COM 特定的錯誤碼。

備註

實作實例提供者時,您應該使用 PSDK 之 WMI 區段中的物件路徑剖析器範例程式代碼來剖析物件路徑,以辨識用戶端要求的物件路徑。 此外,支援衍生類別的提供者只需要提供類別的本機屬性值,而不是繼承的屬性。 WMI 要求基類的提供者處理繼承的屬性。

實作類別提供者時, GetObjectAsync 必須剖析 儲存在 strObjectPath 參數中的類別名稱對象路徑,以判斷要求哪一個類別。 GetObjectAsync 方法接著會動態建置類別,或從私用快取取得類別。 然後,GetObjectAsync 會使用 pResponseHandler 參數指向的 IWbemObjectSink 指標,將類別傳送至 WMI。 系統會呼叫 IWbemObjectSink::SetStatus 方法來指出結果集的結尾。 它也可以呼叫,而不需對 IWbemObjectSink::指出 發生錯誤狀況。

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

如需使用方法半同步的詳細資訊,請參閱 IWbemServices::GetObject呼叫方法

範例

下列範例說明如何實作實例提供者的 GetObjectAsync

SCODE CInstPro::GetObjectAsync (BSTR ObjectPath, 
                                long lFlags, IWbemContext *pCtx,
                                IWbemObjectSink FAR* pHandler)
{
    ULONG cRef;         // Reference count
    SCODE sc;
    BOOL bOK = FALSE;

    IWbemServices *  m_pNamespace;
    IWbemClassObject FAR* pObj;

    // Check arguments.

    if(ObjectPath == NULL || pHandler == NULL ||
        m_pNamespace == NULL)
        return WBEM_E_INVALID_PARAMETER;

    
    // Based on the object path, produce an empty instance
    // of the class and gather required data,
    // setting the instance's property values accordingly.
    // This example assumes that GetByPath is implemented
    // by the provider to do this.
    // The IWbemPath interface can be used to parse
    // the object path, separating the namespace and class name.

    sc = GetByPath (ObjectPath, &pObj, pCtx);
    if(sc == S_OK) 
    {
        pHandler->Indicate (1, &pObj);
        pObj->Release();
        bOK = TRUE;
    }

    sc = (bOK) ? S_OK : WBEM_E_NOT_FOUND;

    // Set status.

    pHandler->SetStatus(0,sc, NULL, NULL);

    // Free memory resources.

    SysFreeString(ObjectPath);
    m_pNamespace->Release();
    pObj->Release();

    return sc;
  
}

下列範例示範一般類別提供者如何實作 GetObjectAsync

HRESULT CStdProvider::GetObjectAsync( 
            /* [in] */ BSTR strObjectPath,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{

    IWbemClassObject *pClass = 0;

// Assume there is an IWbemServices pointer available.
// Retrieve an 'empty' object which is built up
// into the class definition.

    HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
    if (hRes)
        return hRes;

// Parse the object path and determine which class is   
// required. The path string is the required class name.
// Fill in the properties required for the class definition
// using pClass->Put(...), and so on.

    
    // ...

    // Send the class definition back to WMI.
    pResponseHandler->Indicate(1, &pClass);

// Indicate that it is now finished.

    pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);
    SysFreeString(strObjectPath);
    m_pSvc->Release();
    pClass->Release();  // This is no longer needed.
    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

另請參閱

呼叫方法

建立類別

描述 WMI 物件的位置

IWbemServices

IWbemServices::GetObject