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 ); }
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 ); }