怎样用VC在容器端取得ActiveX控件的属性

    技术2022-05-11  100

    怎样获得ActiveX控件的各项属性值 我们需要在容器中获得ActiveX控件的各项属性值,这需要利用一些COM库提供的接口,这篇文章主要是对这一过程作一介绍,从而使大家对这些接口有所了解并学会使用. 首先我们需要在容器方的COleClientItem类中添加一个函数,如InitControlInfo(). 需要注意的事,这个函数要在创建了控件(即CoCreateInstance())之后,在激活控件(即QuickActive()或SetClientSite())之前调用. 在这个函数中,我们将使用以下几个主要的接口:ITypeInfoPtr, IProvideClassInfoPtr请注意:这两个接口是智能指针,所以你不必去管它们的生存周期. 首先,我们要使用m_lpObject成员变量,这个变量是COleClientItem内部实现的.它其实是一个指向IOleObject的指针,在创建控件的时候你需要给它赋值以便后来的使用. 现在我们可以直接使用它. (一):    m_lpObject->QueryInterface( IID_IProvideClassInfo,(void**)&pPCI );//  由此我们获得了IProvideClassInfoPtr pPCI   pPCI->GetClassInfo( &pClassInfo );//  获得ITypeInfoPtr pClassInfo   pClassInfo->GetTypeAttr( &pTypeAttr ) // TYPEATTR* pTypeAttr TYPEATTR使用来描述类型属性的一个结构,它包含很多值,具体可参阅MSDN.     #define IMPLTYPE_MASK (IMPLTYPEFLAG_FDEFAULT¦IMPLTYPEFLAG_FSOURCE¦/IMPLTYPEFLAG_FRESTRICTED)   #define IMPLTYPE_DEFAULTSOURCE (IMPLTYPEFLAG_FDEFAULT¦IMPLTYPEFLAG_FSOURCE)   #define IMPLTYPE_DEFAULTINTERFACE (IMPLTYPEFLAG_FDEFAULT)   BOOL tFoundDefaultSource = FALSE;   BOOL tFoundDefaultInterface = FALSE;   //  这个循环用来找寻声明的资源或接口,pTypeAttr->cImplTypes是声明的类型的数量.   for( iType = 0; (iType < pTypeAttr->cImplTypes) && !(tFoundDefaultSource && tFoundDefaultInterface); iType++ )   {         hResult = pClassInfo->GetImplTypeFlags( iType, &iFlags );//  这里取得的是用序号指定的类型的标志位         if( SUCCEEDED( hResult ) )         {               if( (iFlags&IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE ) //  是否为资源               {                     ASSERT( !tFoundDefaultSource );                     tFoundDefaultSource = TRUE;                     hResult = pClassInfo->GetRefTypeOfImplType( iType, &hRefType );//  先取得声明类型的句柄                     if( FAILED( hResult ) ){return( hResult );}                     hResult = pClassInfo->GetRefTypeInfo( hRefType, &pTypeInfo );//  利用刚才取得句柄来取得TypeInfo 注:这两步必须这样使用.                     if( FAILED( hResult ) {return( hResult );}                     TRACE( "Events:/n" );                     hResult = m_infoEvents.Init( pTypeInfo ); //  利用取得pTypeInfo来初始化控件的事件属性                     //  注:m_infoEvents是一个自定义的类CInterfaceInfo,稍候会讲解该类的Init( ITypeInfo* pTypeInfo )函数                                    if( FAILED( hResult ){return( hResult );}                     pTypeInfo.Release();                 }                 else if( (iFlags&IMPLTYPE_MASK) == IMPLTYPE_DEFAULTINTERFACE )//  是否为接口                 {                       ASSERT( !tFoundDefaultInterface );                       tFoundDefaultInterface = TRUE;                       hResult = pClassInfo->GetRefTypeOfImplType( iType, &hRefType );                       if( FAILED( hResult ) ){return( hResult );}                       hResult = pClassInfo->GetRefTypeInfo( hRefType, &pTypeInfo );                       if( FAILED( hResult ) ){return( hResult );}                       TRACE( "Methods/n" );                       hResult = m_infoMethods.Init( pTypeInfo );//  利用取得pTypeInfo来初始化控件的方法属性                       if( FAILED( hResult ) ){return( hResult );}                       pTypeInfo.Release();               }       }   } (二):这是一个自定义的类CInterfaceInfo,用来保存控件的属性值的.在这里,我们主要在它的Init( ITypeInfo* pTypeInfo )中来取得控件的属性.     pTypeInfo->GetFuncDesc( iMethod, &pFuncDesc ) //  这个函数用来取得指定序号的函数的描述     pTypeInfo->GetVarDesc( iVar, &pVarDesc ) //  这个函数用来取得指定序号的变量的描述 注:关于FUNCDESC和VARDESC结构可以参阅MSDN     这里我们主要来关注一下怎样取属性值,关于函数其实是类似的.   DISPID m_dispid;   BSTR bstrName;   int nNames;   m_dispid = pVarDesc->memid; //  取得属性的DISPID        pTypeInfo->GetNames( m_dispid, &bstrName, 1, &nNames ); //  利用DISPID取得属性的名字   CString m_strName = bstrName;   SysFreeString( bstrName );  //  释放资源   对于PROPERTYPUT我们可能还需要得到属性的某些参数   pVarDesc->elemdescVar则是属性的参数描述信息 注:关于ELEMDESC可以参阅MSDN 在这个类中我们可以为控件分配一个数组列表,用来保存从控件中取得的所有属性.这样以后我们就可以拿来使用了. 我在这里大致描述了一下在容器中取得控件属性的方法,有什么不懂得可以e-mail我.

    最新回复(0)