Неизвестное исключение из IWbemClassObject :: Get

Я пытаюсь получить «ID» из объекта WMI сразу после его сохранения.

После создания экземпляра я сохраняю это так:

hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);

Все отлично и модно — это делает его путь в WMI. Я тогда использую мой pResult, который IWbemCallResult **ppCallResult звонить IWbemCallResult::GetResultObject вот так:

IWbemClassObject *ppResultObject = NULL;
hRes = pResult->GetResultObject(WBEM_INFINITE, &ppResultObject);

Отлично. hRes является S_OK и у меня, кажется, есть экземпляр, на котором я могу получить свойства, используя IWbemClassObject::Get… так что я делаю:

VARIANT v;
hRes = ppResultObject->Get(L"ID", 0, &v, 0, 0);

Независимо от значения, которое на самом деле существует как «ID», значение в VARIANT равно 0. Я не могу получить другие свойства, которые я установил для него (они также 0). Я пробовал бесчисленные варианты этого потока кода, используя ->Get(CComBSTR("ID")..., ->Get(_bstr_t("ID")..., так далее…

hRes является S_OK на этом иди тоже.

Если я заверну все это в try{}catch(...){}, это входит в ловушку, но я не знаю, как определить тип исключения или почему это не сработало. Что-то не так с этой логикой или синтаксисом? Как я могу определить, что происходит с Get(L"ID"... вызов?

Это моя третья неделя в C ++. Пожалуйста, помогите мне не ненавидеть это так сильно.

Редактировать:
Пример Minimal, Complete и Verifiable (настолько полный и проверяемый, насколько это возможно без доступа к моей машине и WMI-соединению):

bool
myNamespace::myWMIWrapper::createUser(User_t * user)
{
IWbemLocator * pIWbemLocator = NULL;
HRESULT hRes = CoCreateInstance(CLSID_WbemLocator,NULL,CLSCTX_ALL,IID_IWbemLocator, (LPVOID *) &pIWbemLocator);

if (SUCCEEDED(hRes))
{
BSTR combinedUserName = NULL;
if (m_username != NULL && m_domainname != NULL)
combinedUserName =_bstr_t(m_domainname) + _bstr_t(_T("\\")) + _bstr_t(m_username);

hRes = pIWbemLocator->ConnectServer(
m_namespace,      // machine name and namespace
combinedUserName, // Userid
m_password,       // PW
NULL,             // Locale
0,                // flags
NULL,             // Authority
pWCtx,            // Context
&pWbemServices );
}

if (FAILED(hRes))
{
LOGGER << _T("Could not connect to the WMI server. Error code = ") << hRes ;
pIWbemLocator->Release();
pIWbemLocator = NULL;
CoUninitialize();
return false;
}

hRes = NULL;
IWbemClassObject *pNewClass = NULL;

BSTR myClassName = SysAllocString(L"My_Class");
hRes = pWbemServices->GetObject(myClassName, 0, NULL, &pNewClass, NULL);

if (FAILED(hRes))
{
LOGGER << _T("hRes failed. Couldn't find class using GetObject with class name:");
LOGGER << className;
}
SysFreeString(myClassName);

if (pNewClass == NULL) {
LOGGER << _T(" No My_Class class Object was found using query.");
return false;
}

LOGGER << _T("Class definition from WMI is found.");
IWbemClassObject *pNUser = NULL;

LOGGER << _T(" Creating an instance of My_Class.");
hRes = S_OK;

hRes = pNewClass->SpawnInstance(NULL, &pNUser);
pNewClass->Release();

if (FAILED(hRes)) {
LOGGER << _T(" My_Class Object can not be instansiated.");
return false;
}

LOGGER << _T(" Updating properties of My_Class found by WMI query");

if (user->getFirstName() != NULL) {
_variant_t v(user->getFirstName()->c_str());
LOGGER << _T(" Updating property FIRSTNAME->") << V_BSTR(&v) ;
pNuser->Put(L"FIRSTNAME", 0, &v, 0);
}

if (user->getLastName() != NULL) {
_variant_t v(user->getLastName()->c_str());
LOGGER <<_T(" Updating property LASTNAME->")<< V_BSTR(&v) ;
pNuser->Put(L"LASTNAME", 0, &v, 0);
}

LOGGER << _T(" Persisting My_Class information");

IWbemCallResult *pCallRes;
hRes = pWbemServices->PutInstance(pNuser, WBEM_FLAG_CREATE_OR_UPDATE, NULL, &pCallRes);
if (FAILED(hRes)) {
LOGGER << _T(" Persisting of the My_Class object failed.");
return false;
}

_variant_t vnt = NULL;
IWbemClassObject *objPtr = NULL;
LOGGER << _T(" calling ->GetResultObject()");
hRes = pCallRes->GetResultObject(WBEM_INFINITE, &objPtr);

if (FAILED(hRes)) {
LOGGER << _T(" calling GetResultObject failed");
return false;
}

LOGGER << _T("Calling ->Get(ID) on instance retrieved from GetResultObject.");
try {
// This line gets executed before entering catch(...)
hRes = objPtr->Get(L"ID", 0, &vnt, NULL, NULL);
}
catch (const std::exception& ex) {
LOGGER << _T(" problem with Get") << ex.what();
}
catch (...) { // I'm entering this catch block.
LOGGER << _T(" unknown exception...............");
}

return true;
}

1

Решение

Я решил проблему, изменив

hRes = pCallRes->GetResultObject(WBEM_INFINITE, &objPtr);

в

BSTR objPath = NULL;
hRes = pCallRes->GetResultString(WBEM_INFINITE, &objPath);
...
hRes = pWbemServices->GetObject(objPath, 0, NULL, &objPtr, NULL);

который сделал vnt в

hRes = objPtr->Get(L"ID", 0, &vnt, NULL, NULL);

не быть 0,

Похоже, что для экземпляра выполнялась некоторая обработка, прежде чем он был фактически сохранен, поэтому result object это было извлечено не было «готово». Когда я GetResultString и повторно получить объект на основе этого пути к объекту, в котором есть доступные значения. Пойди разберись.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]