HRESULT CCOMDispatchHelper::GetPropertyItemValues(const IDispatchPtr& pICollection, int iIndex, _bstr_t& bstrName, _bstr_t& bstrValue) { HRESULT hr = E_FAIL; variant_t result, vIndex; vIndex.lVal = iIndex; vIndex.vt = VT_I4; hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pICollection, L"Item", 1, vIndex); RETURN_FAILED(hr); IDispatchPtr spPropItem = result.pdispVal; variant_t vPropItem; hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &vPropItem, spPropItem, L"Name", 0); RETURN_FAILED(hr); bstrName.Assign(vPropItem.bstrVal); hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &vPropItem, spPropItem, L"Value", 0); RETURN_FAILED(hr); //ComConvertUtils aComConvertUtils; //TODO look at a better way of casting a variant_t to a PROPVARIANT bstrValue = (LPCTSTR)PropVariantToString(*(PROPVARIANT*)(VARIANT*)&vPropItem); return hr; }
HRESULT CCOMDispatchHelper::GetPropertyItemDateTimeValues(const IDispatchPtr& pICollection, int iIndex, _bstr_t& bstrName, FILETIME& ftValue) { HRESULT hr = E_FAIL; ftValue.dwHighDateTime = 0; ftValue.dwLowDateTime = 0; variant_t result; variant_t vIndex; vIndex.lVal = iIndex; vIndex.vt = VT_I4; hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pICollection, L"Item", 1, vIndex); RETURN_FAILED(hr); IDispatchPtr spPropItem = result.pdispVal; variant_t vPropItem; hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &vPropItem, spPropItem, L"Name", 0); RETURN_FAILED(hr); bstrName.Assign(vPropItem.bstrVal); _variant_t vtTime; VariantInit(&vtTime); hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &vtTime, spPropItem, L"Value", 0); RETURN_FAILED(hr); if(vtTime.vt != VT_DATE) return E_INVALIDARG; COleDateTime OLETime(vtTime); SYSTEMTIME sysTime; if(!OLETime.GetAsSystemTime(sysTime)) return E_FAIL; ::SystemTimeToFileTime(&sysTime, &ftValue); return hr; }