Поделиться через


Метод Provider::ExecQuery (provider.h)

[Класс Provider является частью платформы поставщика WMI, которая в настоящее время рассматривается в окончательном состоянии, и никакие дальнейшие разработки, улучшения или обновления не будут доступны для проблем, не связанных с безопасностью, влияющих на эти библиотеки. API mi mi следует использовать для всех новых разработок.]

Метод 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. WMI также может вызывать ExecQuery, если запрос клиента содержит оператор ASSOCIATORS OF или REFERENCES OF, описывающий ваш класс. Если реализация ExecQuery возвращает WBEM_E_NOT_SUPPORTED, клиент использует WMI для обработки запроса.

WMI обрабатывает запрос, вызывая реализацию CreateInstanceEnum для предоставления всех экземпляров. Затем WMI фильтрует результирующий экземпляр перед возвратом экземпляров клиенту. Поэтому любая реализация ExecQuery, созданная вами, должна быть более эффективной, чем CreateInstanceEnum.

Ниже описана общая реализация ExecQuery:

  1. Создайте пустой экземпляр класса с помощью provider::CreateNewInstance.
  2. Определите подмножество экземпляров, которые необходимо создать.

    Вы можете использовать такие методы, как IsPropertyRequired , чтобы узнать, какие свойства требуются, и GetValuesForProp , чтобы узнать, какие экземпляры требуются WMI. К другим методам, которые относятся к запрошенным свойствам, относятся CFrameworkQuery::GetRequiredProperties, CFrameworkQuery::AllPropertiesAreRequired и CFrameworkQuery::KeysOnly.

  3. Заполните свойства пустого экземпляра с помощью методов Set класса CInstance , таких как CInstance::SetByte или CInstance::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.

Однако при написании поставщика платформы следует учитывать следующее:

  • Убедитесь, что в классе ассоциации поддерживаются стандартные запросы, особенно запросы, в которых ссылочные свойства используются в предложении WHERE. Дополнительные сведения см. в разделе CFrameworkQuery::GetValuesForProp.
  • При проверка, чтобы узнать, существуют ли конечные точки, при поддержке класса ассоциации используйте методы CWbemProviderGlue::GetInstanceKeysByPath или CWbemProviderGlue::GetInstancePropertiesByPath.

    Эти методы позволяют конечным точкам пропускать заполнение ресурсоемких или ненужных свойств.

  • Убедитесь, что все классы конечных точек связи поддерживают методы Get для каждого свойства. Дополнительные сведения см. в разделе Поддержка операций Partial-Instance. Дополнительные сведения о параметре запроса см. в разделе CFrameworkQuery.

Требования

   
Минимальная версия клиента Windows Vista
Минимальная версия сервера Windows Server 2008
Целевая платформа Windows
Header provider.h (включая FwCommon.h)
Библиотека FrameDyn.lib
DLL FrameDynOS.dll; FrameDyn.dll