VARTYPE CMethodInfo::GetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt) { CComPtr<ITypeInfo> spTypeInfo; VARTYPE vt = VT_USERDEFINED; HRESULT hr = E_FAIL; hr = pTI->GetRefTypeInfo(hrt, &spTypeInfo); if(FAILED(hr)) return vt; CSmartTypeAttr pta(spTypeInfo); spTypeInfo->GetTypeAttr(&pta); if(&pta && pta->typekind == TKIND_ALIAS) { if (pta->tdescAlias.vt == VT_USERDEFINED) GetUserDefinedType(spTypeInfo,pta->tdescAlias.hreftype); else vt = pta->tdescAlias.vt; } return vt; }
HRESULT CPropertyBrowseControl::AddDispatch(IDispatch* pDisp) { CComPtr<ITypeInfo> spTypeInfo; if (pDisp == NULL) return S_OK; pDisp->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &spTypeInfo); if (spTypeInfo == NULL) return E_FAIL; TYPEATTR* pta; spTypeInfo->GetTypeAttr(&pta); if (pta->typekind == TKIND_INTERFACE) { // Get the dual CComPtr<ITypeInfo> spInfoTemp; HREFTYPE hRef; HRESULT hr = (int)spTypeInfo->GetRefTypeOfImplType(-1, &hRef); if (FAILED(hr)) return E_FAIL; hr = spTypeInfo->GetRefTypeInfo(hRef, &spInfoTemp); if (FAILED(hr)) return E_FAIL; spTypeInfo->ReleaseTypeAttr(pta); spTypeInfo = spInfoTemp; spTypeInfo->GetTypeAttr(&pta); } int item = m_list.GetItemCount(); for (int i=0; i<pta->cFuncs; i++) { FUNCDESC* pfd; spTypeInfo->GetFuncDesc(i, &pfd); if (pfd->invkind & DISPATCH_PROPERTYGET && (pfd->wFuncFlags & (FUNCFLAG_FRESTRICTED | FUNCFLAG_FHIDDEN)) == 0) { switch (pfd->elemdescFunc.tdesc.vt) { case VT_USERDEFINED: case VT_EMPTY: case VT_NULL: case VT_I2: case VT_I4: case VT_R4: case VT_R8: case VT_CY: case VT_DATE: case VT_BSTR: case VT_ERROR: case VT_BOOL: case VT_VARIANT: case VT_DECIMAL: case VT_I1: case VT_UI1: case VT_UI2: case VT_UI4: case VT_INT: case VT_UINT: { CComPtr<ITypeInfo> spUserTypeInfo; if (pfd->elemdescFunc.tdesc.vt == VT_USERDEFINED) { HREFTYPE hrt = pfd->elemdescFunc.tdesc.hreftype; VARTYPE vt = VT_USERDEFINED; HRESULT hr = E_FAIL; hr = GetEnumTypeInfo(spTypeInfo, hrt, &spUserTypeInfo); if(FAILED(hr)) vt = GetUserDefinedType(spTypeInfo, hrt); } CComVariant varVal; CComBSTR bstrVal; CComBSTR bstrName; CComBSTR bstrDocString; spTypeInfo->GetDocumentation(pfd->memid, &bstrName, &bstrDocString, NULL, NULL); CComDispatchDriver dd(pDisp); #pragma warning (suppress: 6031) dd.GetProperty(pfd->memid, &varVal); CProperty* pProp = new CProperty(pDisp, pfd->memid, varVal, bstrDocString, spUserTypeInfo); pProp->GetStringValue(&bstrVal); m_list.AddItem(item, 0, COLE2T(bstrName)); m_list.AddItem(item, 1, COLE2T(bstrVal)); LPARAM lItem = (LPARAM)pProp; m_list.SetItemData(item, (DWORD)lItem); item++; } } } spTypeInfo->ReleaseFuncDesc(pfd); } spTypeInfo->ReleaseTypeAttr(pta); return S_OK; }