Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}