У меня есть блок кода C ++, в котором я пытаюсь вызвать метод WMI, определенный компанией. При попытке создать объект IWbemClassObject, представляющий параметры, я получаю сообщение об ошибке WBEM_E_NOT_FOUND. Согласно Сайт MSDN, это не должно быть действительным HRESULT.
/* pSvc has been setup already, all calls returned S_OK. Ugly Debugging statements have been sprinkled throughout the code. */
HRESULT hres;
IWbemClassObject* DataInClass;
IWbemClassObject* DataOutClass;
IWbemClassObject* CallingObject;
/* Grab the types of parameters we will be using for Input and Output.
DataIn and DataOut are set to the classes we will be using */
hres = pSvc->GetObject(
_bstr_t("ObjectName"),
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&CallingObject,
NULL
);
cout << "GetObject:" << hres << endl;
string function_type = "MethodName";
hres = CallingObject->GetMethod(
_bstr_t(function_type.c_str()),
0,
&DataInClass,
&DataOutClass
);
cout << "GetMethod:" << hres << endl;
if(hres == WBEM_S_NO_ERROR) cout << "No Error" << endl;
if(hres == WBEM_E_NOT_FOUND) cout << "Not found" << endl;
if(hres == WBEM_E_OUT_OF_MEMORY) cout << "OOM" << endl;
/* Create an instance of DataIn and DataOut and populate the parameters */
IWbemClassObject* DataIn;
IWbemClassObject* DataOut;
hres = DataInClass->SpawnInstance(0, &DataIn);
hres = DataOutClass->SpawnInstance(0, &DataOut);
/* NOTE: up to this point, all HRESULTS have been returning S_OK. I'm getting appropriate pointer values, so it appears that the code can connect to WMI. */
/* Set all of the parameters needed for DataIn */
VARIANT var;
// Active: true
_variant_t varActive(true);
var = varActive.Detach();
hres = DataIn->Put(_bstr_t("Active"), 0, &var, 0);
VariantClear(&var);
switch(hres){
case WBEM_E_FAILED: cout << "Failed" << endl; break;
case WBEM_E_INVALID_PARAMETER: cout << "ip" << endl; break;
case WBEM_E_INVALID_PROPERTY_TYPE: cout << "ipt" << endl; break;
case WBEM_E_OUT_OF_MEMORY: cout << "oom" << endl; break;
case WBEM_E_TYPE_MISMATCH: cout << "typem" << endl; break;
case WBEM_S_NO_ERROR: cout << "ok" << endl; break;
case WBEM_E_NOT_FOUND: cout << "WHAT!?" << endl; break; // This is the error code being returned from DataIn->Put
default: cout << "nota?" << endl; break;
}
Кто-нибудь знает, почему это может происходить, и как я могу это исправить?
Спасибо заранее,
Zach
Обычно эта ошибка возникает с командами «GET».
В большинстве случаев конкретная причина ошибки зависит от класса WMI, к которому вы пытаетесь получить доступ. Например, WMIDiag имеет это сказать относительно того, когда эта ошибка возвращается при попытке подключиться к счетчику производительности:
Когда класс производительности WMI отсутствует (то есть «Win32_PerfRawData_TermService_TerminalServices»), это обычно происходит из-за
отсутствие обновления буфера у провайдера класса WMI, выставляющего счетчики производительности WMI.
Вы можете обновить буфер поставщика класса WMI с помощью следующей команды:
‘WINMGMT.EXE / SYNCPERF’
В других случаях эта ошибка чаще всего вызвана поврежденным хранилищем. Увидеть этот Статья MS KB для примера.
Поскольку вы упомянули метод WMI, указанный компанией, я предполагаю, что вы зарегистрировали своего собственного поставщика WMI. Я подозреваю, что этот провайдер не зарегистрирован должным образом в WMI, прежде чем я начну перестраивать хранилище.
Прошел почти год с тех пор, как вы задали вопрос, я думаю, вы, наверное, поняли это. Если это так, я думаю, что сообщество будет благодарно, если вы опубликуете здесь свои результаты, чтобы другие пользователи могли извлечь из этого пользу.
Других решений пока нет …