Provider::ExecQuery 方法 (provider.h)

[提供者類別是 WMI 提供者 架構的一部分,現在被視為最終狀態,而且不會針對影響這些程式庫的非安全性相關問題使用進一步的開發、增強功能或更新。 MI API應該用於所有新的開發。]

ExecQuery方法是由 WMI 呼叫,以處理 WMI 查詢語言 (WQL) 查詢。

語法

HRESULT ExecQuery(
        MethodContext     *pMethodContext,
  [ref] CFrameworkQuery & cQuery,
        long              lFlags
);

參數

pMethodContext

這個呼叫之內容物件的指標。 這個值包含用戶端所指定的任何 IWbemCoNtext 屬性。 此外,此指標必須當做回 WMI 的任何呼叫的參數使用。

[ref] cQuery

提供者架構已剖析之查詢的指標。

lFlags

旗標的位元遮罩,其中包含執行查詢作業的相關資訊。 這是 IWbemServices::ExecQuery 方法中用戶端所指定的值。

下列旗標是由 WMI 處理 (並篩選掉) :

  • WBEM_FLAG_ENSURE_LOCATABLE
  • WBEM_FLAG_FORWARD_ONLY
  • WBEM_FLAG_BIDIRECTIONAL
  • WBEM_FLAG_USE_AMENDED_QUALIFIERS
  • WBEM_FLAG_RETURN_IMMEDIATELY
  • WBEM_FLAG_PROTOTYPE

傳回值

此方法的預設架構提供者實作會將 WBEM_E_PROVIDER_NOT_CAPABLE 傳回給呼叫方法。 IWbemServices::ExecQuery方法會列出常見的傳回值,不過您可以選擇傳回任何 COM 傳回碼。

備註

WMI 通常會呼叫 ExecQuery ,以回應 IWbemServices::ExecQuery的用戶端呼叫,其中用戶端會傳入選取的屬性清單或 WHERE 子句。 如果用戶端查詢包含描述類別的 「ASSOCIATORS OF」 或 「REFERENCES OF」 語句,WMI 也可以呼叫 ExecQuery 。 如果您的 ExecQuery 實作傳回 WBEM_E_NOT_SUPPORTED,用戶端會依賴 WMI 來處理查詢。

WMI 會呼叫 CreateInstanceEnum 的實作來處理查詢,以提供所有實例。 接著,WMI 會先篩選產生的實例,再將實例傳回用戶端。 因此,您所建立 的任何 ExecQuery 實作都必須比 CreateInstanceEnum更有效率。

下列描述 ExecQuery的常見實作:

  1. 使用 Provider::CreateNewInstance建立類別的空白實例。
  2. 決定您應該建立的實例子集。

    您可以使用 IsPropertyRequired 之類的方法來查看所需的屬性,以及 GetValuesForProp 來查看 WMI 所需的實例。 處理要求屬性的其他方法包括 CFrameworkQuery::GetRequiredPropertiesCFrameworkQuery::AllPropertiesAreRequiredCFrameworkQuery::KeysOnly

  3. 使用 CInstance 類別的 Set 方法填入空白實例的屬性,例如 CInstance::SetByteCInstance::SetStringArray
  4. 使用 CInstance::Commit將實例傳回用戶端。
  5. 傳回適當的傳回值。

    預設 ExecQuery 架構提供者實作會 傳回WBEM_E_PROVIDER_NOT_CAPABLE。 如果您實作 ExecQuery,您應該使用 IWbemServices::ExecQuery中列出的一般傳回值。 不過,如有必要,您可以傳回任何 COM 傳回碼。

WMI 不會透過架構提供者傳送 「ASSOCIATORS OF」 或 「REFERENCES OF」 查詢。 相反地,WMI 會使用架構來判斷哪些類別與有問題的類別相關,並產生適當的 WQL 查詢來擷取結果。 因此,您不需要撰寫任何其他 「ASSOCIATORS OF」 和 「REFERENCES OF」 查詢的支援。

不過,撰寫架構提供者時,您應該記住下列事項:

需求

   
最低支援的用戶端 Windows Vista
最低支援的伺服器 Windows Server 2008
目標平台 Windows
標頭 provider.h (include FwCommon.h)
程式庫 FrameDyn.lib
Dll FrameDynOS.dll;FrameDyn.dll