来自IWbemClassObject的未知异常::获取

问题描述:

我试图从WMI对象中检索一个“ID”,并保留它。来自IWbemClassObject的未知异常::获取

建立实例后,我坚持它像这样:

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

所有罚款和花花公子 - 这使得它的方式进入WMI。然后我用我的pResult,这是IWbemCallResult **ppCallResult调用IWbemCallResult::GetResultObject像这样:

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

大。 hResS_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")...等...

hResS_OK对此获取。

如果我将它全部包装在try{}catch(...){}中,它会进入捕获,但我不知道如何确定异常类型或为什么会失败。这个逻辑或语法有什么问题吗?如何确定Get(L"ID"...调用出了什么问题?

这是我在C++的第三周。请帮助我不要那么讨厌它。

编辑: 最小的,完整的和可验证的例子(如完整和可核查的,因为它可以在不访问我的机器和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

请提供一个[最小,完整和可验证示例](http://*.com/help/mcve),显示您正在做的所有事情。 –

我改变

解决问题
hRes = pCallRes->GetResultObject(WBEM_INFINITE, &objPtr); 

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

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

制成vnt0

似乎在实例被实际保留之前对该实例进行了一些处理,因此正在检索的result object未“准备就绪”。当我GetResultString并基于该对象路径重新获取对象时,它具有可用的值。去搞清楚。