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

原创 2000年10月09日 11:10:00
怎样获得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&brvbarIMPLTYPEFLAG_FSOURCE&brvbar/IMPLTYPEFLAG_FRESTRICTED)
  #define IMPLTYPE_DEFAULTSOURCE (IMPLTYPEFLAG_FDEFAULT&brvbarIMPLTYPEFLAG_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我.

VC ActiveX 控件 开发总结

VC 制作ActiveX 控件(OCX) http://ileson.iteye.com/blog/1002910 1、vc6下建立一下activeX工程     详见http://hi...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月27日 12:19
  • 1524

在VS2010中开发ActiveX控件设置测试容器的方式

在VS2010中开发MFC ActiveX控件,开发完后,通常使用VS自带的容器ActiveX Control Test Container来运行ActiveX控件。此容器在VS安装后的文件中是找不到...
  • zang141588761
  • zang141588761
  • 2015年12月30日 14:11
  • 1379

在IE中使用ActiveX控件,需要使用HTML中的标志是<OBJECT>,该标记几个重要的参数特性有:

在IE中使用ActiveX控件,需要使用HTML中的标志是 1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的入口。 2.CLASSID:是该控件唯一的UID,告诉IE装入哪个对...
  • guorun18
  • guorun18
  • 2015年12月15日 10:32
  • 2299

ActiveX Control Property Page ContainerActiveX控件属性页容器

  • 2006年02月23日 09:05
  • 40KB
  • 下载

用vs2012做ActiveX控件并使用html、c#、c++测试容器

  • 2013年03月27日 18:06
  • 145KB
  • 下载

ActiveX控件测试容器

  • 2012年12月11日 11:11
  • 237KB
  • 下载

使用回调接口实现ActiveX控件和它的容器程序的通讯

  • 2017年06月24日 09:38
  • 174KB
  • 下载

ActiveX控件测试容器

  • 2016年11月01日 21:15
  • 280KB
  • 下载

Visual Studio 调试ActiveX控件容器工具TstCon.exe

  • 2016年09月17日 20:10
  • 280KB
  • 下载

ActiveX控件测试容器

  • 2018年01月03日 15:04
  • 276KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样用VC在容器端取得ActiveX控件的属性
举报原因:
原因补充:

(最多只允许输入30个字)