Вызовы WMI
Поставщики могут вызывать методы, реализованные WMI, из своих реализаций методов. Однако существуют особые рекомендации, когда поставщик вызывает реализацию WMI метода IWbemServices из собственной реализации того же метода. Эти рекомендации важны независимо от того, вызывает ли поставщик синхронную или асинхронную версию метода.
Каждый метод IWbemServices , который может реализовать поставщик, имеет параметр pCtx , указатель на реализацию интерфейса IWbemContext . Когда WMI вызывает поставщик, WMI передает допустимый указатель в этом параметре. Поставщик всегда должен передавать этот же указатель во всех вызовах WMI, выполняемых во время обслуживания запросов. Пренебрежение соответствующим образом задать pCtx может привести к тому, что WMI запустит бесконечный цикл.
В следующем примере кода показан правильный способ вызова реализации WMI GetObject из реализации GetObjectAsync.
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
Для правильной компиляции примера кода C++ в этом разделе требуются следующие ссылки и инструкции #include.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Поставщики экземпляров, классов и свойств не должны выполнять вызовы WMI, запрашивающие изменение данных во время обслуживания запроса на чтение. Единственными поставщиками, которые являются исключениями из этого правила, являются поставщики push-уведомлений. Поставщик push-уведомлений — это поставщик класса, который хранит данные в репозитории WMI и использует WMI для обработки запросов от клиентов. При обслуживании запроса на чтение поставщик принудительной отправки может обновить репозиторий WMI, но должен задать для параметра lFlagsзначение WBEM_FLAG_OWNER_UPDATE в соответствующем вызове IWbemServices .
Поставщики событий не должны вносить изменения в класс во время обслуживания вызова. Они также не могут выполнять вызовы, связанные с событиями, например изменение фильтра событий.
Связанные темы