void COPCItem::getProperties(const CAtlArray<CPropertyDescription> &propsToRead, ATL::CAutoPtrArray<SPropertyValue> &propsRead){ unsigned noProperties = (DWORD)propsToRead.GetCount(); VARIANT *pValues = NULL; HRESULT *pErrors = NULL; DWORD *pPropertyIDs = new DWORD[noProperties]; for (unsigned i = 0; i < noProperties; i++){ pPropertyIDs[i] = propsToRead.GetAt(i).id; } propsRead.RemoveAll(); propsRead.SetCount(noProperties); USES_CONVERSION; HRESULT res = group.getServer().getPropertiesInterface()->GetItemProperties(T2OLE(name), noProperties, pPropertyIDs, &pValues, &pErrors); delete []pPropertyIDs; if (FAILED(res)){ throw OPCException("Failed to restrieve property values", res); } for (unsigned i = 0; i < noProperties; i++){ CAutoPtr<SPropertyValue> v; if (!FAILED(pErrors[i])){ v.Attach(new SPropertyValue(propsToRead[i], pValues[i])); } propsRead[i]=v; } COPCClient::comFree(pErrors); COPCClient::comFreeVariant(pValues, noProperties); }