Example #1
0
HRESULT CMethodInfo::InitPropertyPut( ITypeInfo* pTypeInfo, const VARDESC* pVarDesc )
{
	HRESULT hResult;
	CComBSTR bstrName;
	UINT nNames;

	DbgAssert( pTypeInfo != NULL );
	DbgAssert( pVarDesc != NULL );

	m_pIntTypeInfo = pTypeInfo;
	m_dispid = pVarDesc->memid;
	m_invkind = INVOKE_PROPERTYPUT;
	m_readOnly = pVarDesc->wVarFlags&VARFLAG_FREADONLY;
	m_isHidden = pVarDesc->wVarFlags&(VARFLAG_FHIDDEN);
	m_tBindable = pVarDesc->wVarFlags&VARFLAG_FBINDABLE;
	m_tRequestEdit = pVarDesc->wVarFlags&FUNCFLAG_FREQUESTEDIT;

	hResult = pTypeInfo->GetNames( m_dispid, &bstrName, 1, &nNames );
	if( FAILED( hResult ) )
	{
		return( hResult );
	}
	DbgAssert( nNames == 1 );

	m_strName = TSTR::FromBSTR(bstrName); 

	m_apParamInfo.SetCount( 1 );
	m_apParamInfo[0] = new CParamInfo;
	if( m_apParamInfo[0] == NULL )
	{
		return( E_OUTOFMEMORY );
	}

	const TSTR strPropertyValue = _T("Property"); //!Hey

	m_apParamInfo[0]->Init( strPropertyValue.ToOLESTR() );

	// get the return string
	const TYPEDESC* tdesc = &(pVarDesc->elemdescVar.tdesc);
	while (tdesc->vt == VT_PTR)
		tdesc = tdesc->lptdesc;
	GetTypeString(tdesc, m_strReturn, true, &m_spTypeInfo);

	return( S_OK );
}
Example #2
0
HRESULT CMethodInfo::Init( ITypeInfo* pTypeInfo, const FUNCDESC* pFuncDesc )
{
	HRESULT hResult;
	BSTR *pbstrNames;
	UINT nNames;
	int iParam;
	UINT iName;
	LPCOLESTR pszParamName;
	const TSTR strPropertyValue = _T("Property");	


	DbgAssert( pTypeInfo != NULL );
	DbgAssert( pFuncDesc != NULL );

	m_pIntTypeInfo = pTypeInfo;
	m_dispid = pFuncDesc->memid;
	m_invkind = pFuncDesc->invkind;
	m_tBindable = pFuncDesc->wFuncFlags&FUNCFLAG_FBINDABLE;
	m_tRequestEdit = pFuncDesc->wFuncFlags&FUNCFLAG_FREQUESTEDIT;
	m_isHidden = pFuncDesc->wFuncFlags&(FUNCFLAG_FHIDDEN/*|FUNCFLAG_FNONBROWSABLE*/);
	const TYPEDESC* tdesc = &(pFuncDesc->elemdescFunc.tdesc);

	m_apParamInfo.SetCount( pFuncDesc->cParams );
	for( iParam = 0; iParam < m_apParamInfo.Count(); iParam++ )
	{
		m_apParamInfo[iParam] = new CParamInfo;
		if( m_apParamInfo[iParam] == NULL )
		{
			return( E_OUTOFMEMORY );
		}
	}

	pbstrNames = (BSTR*)alloca( (pFuncDesc->cParams+1)*sizeof( BSTR ) );
	for( iName = 0; iName < UINT( pFuncDesc->cParams+1 ); iName++ )
	{
		pbstrNames[iName] = NULL;
	}

	hResult = pTypeInfo->GetNames( m_dispid, pbstrNames, pFuncDesc->cParams+1, &nNames );
	if( FAILED( hResult ) )
	{
		return( hResult );
	}
	DbgAssert( nNames > 0 );

	m_strName = TSTR::FromBSTR(pbstrNames[0]);
#ifdef MAX_TRACE
	//DebugPrint(_T("  Method: %s "), LPCTSTR( m_strName ) );
#endif
	switch( m_invkind )
	{
		case INVOKE_FUNC:
			DbgAssert( nNames == UINT( pFuncDesc->cParams+1 ) );
			break;

		case INVOKE_PROPERTYGET:
			DbgAssert( nNames == UINT( pFuncDesc->cParams+1 ) );
			break;

		case INVOKE_PROPERTYPUT:
			DbgAssert( nNames == UINT( pFuncDesc->cParams ) );
			break;

		case INVOKE_PROPERTYPUTREF:
			DbgAssert( nNames == UINT( pFuncDesc->cParams ) );
			break;

		default:
			DbgAssert( FALSE );
			break;
	}
	for( iParam = 0; iParam < m_apParamInfo.Count(); iParam++ )
	{
		if( pbstrNames[iParam+1] == NULL )
		{
			// This must be the right-hand side of a property put or putref.
			pszParamName = strPropertyValue.ToOLESTR();
		}
		else
		{
			pszParamName = pbstrNames[iParam+1];
		}
		m_apParamInfo[iParam]->Init( pszParamName );
		TYPEDESC* pdesc = &pFuncDesc->lprgelemdescParam[iParam].tdesc;
		m_apParamInfo[iParam]->m_flags = pFuncDesc->lprgelemdescParam[iParam].paramdesc.wParamFlags;

		while (pdesc->vt == VT_PTR)
			pdesc = pdesc->lptdesc;
		GetTypeString(pdesc, m_apParamInfo[iParam]->m_strType, true, &(m_apParamInfo[iParam]->m_spTI));
	}
	for( iName = 0; iName < UINT( pFuncDesc->cParams+1 ); iName++ )
	{
		if( pbstrNames[iName] != NULL )
		{
			::SysFreeString( pbstrNames[iName] );
		}
	}	
	while (tdesc->vt == VT_PTR)
		tdesc = tdesc->lptdesc;
	
	// get the return string
	m_returnType = tdesc->vt;
	GetTypeString(tdesc, m_strReturn, true, &m_spTypeInfo);
	return( S_OK );
}