IWbemServices::CreateClassEnumAsync 方法 (wbemcli.h)
IWbemServices::CreateClassEnumAsync方法會傳回類別提供者支援的所有類別列舉。 類別提供者會從頭開始建立每個類別定義,並只傳回所要求類別的子類別。 作為非同步方法, CreateClassEnumAsync 會立即傳回狀態訊息,然後視需要更新透過 pResponseHandler 參數傳遞的接收。
當呼叫成功時,WMI 會在pResponseHandler指標上呼叫AddRef、立即傳回,然後以非同步方式呼叫pResponseHandler – >指示從另一個具有類別定義的執行緒,直到滿足查詢為止。
語法
HRESULT CreateClassEnumAsync(
[in] const BSTR strSuperclass,
[in] long lFlags,
[in] IWbemContext *pCtx,
[in] IWbemObjectSink *pResponseHandler
);
參數
[in] strSuperclass
如果不是 Null 或空白,此參數會指定父類別名稱。 列舉值中只會傳回屬於這個類別之子類別的類別。 如果 Null 或空白且 lFlags是WBEM_FLAG_SHALLOW,則只會傳回最上層類別,也就是沒有父類別的類別。 如果它是 Null 或空白,且 lFlags是WBEM_FLAG_DEEP,則會傳回命名空間中的所有類別。
[in] lFlags
下列一或多個值有效。
WBEM_FLAG_USE_AMENDED_QUALIFIERS
如果設定此旗標,Windows Management Instrumentation (WMI) 會擷取儲存在目前連線地區設定之當地語系化命名空間中已修改的限定詞。 如果未設定,只會擷取儲存在立即命名空間中的限定詞。
WBEM_FLAG_BIDIRECTIONAL
此旗標會導致 WMI 保留列舉物件的指標,直到用戶端釋放列舉值為止。
WBEM_FLAG_DEEP
此旗標會強制列舉在階層中包含這個和所有子類別。
WBEM_FLAG_SHALLOW
此旗標會強制列舉只包含這個類別的純實例,但不包括提供此類別中找不到屬性的所有子類別實例。
WBEM_FLAG_SEND_STATUS
此旗標會在 WMI 中註冊要求,以透過 IWbemObjectSink::SetStatus的用戶端實作接收中繼狀態報表。 提供者實作必須支援此旗標的中繼狀態報表,才能變更行為。
[in] pCtx
通常 為 Null。 否則,這是 IWbemCoNtext 物件的指標,可供傳回所要求類別的提供者使用。 內容物件中的值必須在提供者的檔中指定。 如需此參數的詳細資訊,請參閱 呼叫 WMI。
[in] pResponseHandler
IWbemObjectSink呼叫端實作的指標。 此處理程式會使用 IWbemObjectSink::Indicate 方法接收物件。 沒有可用的物件時,WMI 會呼叫 IWbemObjectSink::SetStatus 方法。 如果傳回任何錯誤碼,則不會使用提供的 IWbemObjectSink 指標。 如果傳回WBEM_S_NO_ERROR,則會呼叫使用者 IWbemObjectSink 實作來指出作業的結果。 WMI 只有在WBEM_S_NO_ERROR傳回時,才會在指標上呼叫AddRef。 當錯誤碼傳回時,參考計數與沒有專案相同。 如需此參數的詳細說明,請參閱 呼叫方法。
傳回值
這個方法會傳回 HRESULT ,指出方法呼叫的狀態。 失敗時,您可以從 COM 函式 GetErrorInfo取得可用的資訊。 如果網路問題造成您遺失 WMI 的遠端連線,則可以傳回 COM 特定的錯誤碼。 請注意,如果 CreateClassEnumAsync 傳回WBEM_S_NO_ERROR,WMI 會等候回應處理常式 之 SetStatus 方法的結果。 WMI 會在本機連線上無限期等候,或直到遠端連線逾時為止。 下列清單列出 HRESULT中包含的值。
備註
由於回呼可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步而非非同步通訊。 如果您需要非同步通訊,請參閱 呼叫方法。
如需以半同步方式使用方法的詳細資訊,請參閱 IWbemServices::CreateClassEnum 和 呼叫方法。
範例
下列程式碼範例示範如何實作 CreateClassEnumAsync。
HRESULT CStdProvider::CreateClassEnumAsync(
/* [in] */ BSTR strSuperclass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{
IWbemClassObject *pClass = 0;
// Assume there is an IWbemServices pointer available (m_pSvc).
// Retrieve an 'empty' object that will be built up
// into the class definition.
HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
if (hRes)
{
return hRes;
}
// Prepare an empty object to receive the class definition.
IWbemClassObject *pNextClass = 0;
hRes = pClass->Clone(&pNextClass);
// Now loop through the private source of class definitions
// and create each class.
while(hRes)
{
// Create the class definition elsewhere.
// For example, call a function that creates a definition:
// FillClassDef(pNextClass);
// Deliver the class to WMI.
pResponseHandler->Indicate(1, &pNextClass);
pNextClass->Release( );
// Prepare an empty object to receive the class definition.
IWbemClassObject *pNextClass = 0;
hRes = pClass->Clone(&pNextClass);
}
pClass->Release();
// Send a finish message to WMI.
pResponseHandler->SetStatus(0, hRes, 0, 0);
return hRes;
}
在上述範例中,類別提供者會從 WMI 取得執行緒來執行必要的作業。 您可能想要呼叫接收 AddRef 方法,並建立另一個執行緒來傳遞結果集中的物件。 建立另一個執行緒可讓目前的執行緒返回 WMI,而不需要耗盡執行緒集區。 提供者選擇單一線程設計還是雙執行緒設計取決於提供者計畫使用 WMI 執行緒的時間量。 沒有固定的規則。 測試可協助您判斷設計如何影響 WMI 效能。
規格需求
最低支援的用戶端 | 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 |