荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 怎样用VC在容器端取得ActiveX控件的属性
发信站: 荔园晨风BBS站 (Fri Jun  8 07:53:49 2001), 转信

怎样获得activex控件的各项属性值

    我们需要在容器中获得activex控件的各项属性值,这需要利用一些com库提供的接口,
这篇文章主要是对这一过程作一介绍,从而使大家对这些接口有所了解并学会使用.

   首先我们需要在容器方的coleclientitem类中添加一个函数,如initcontrolinfo().
需要注意的事,这个函数要在创建了控件(即cocreateinstance())之后,在激活控件(即q
uickactive()或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|\impltyp
eflag_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, &href
type );//  先取得声明类型的句柄
                    if( failed( hresult ) ){return( hresult );}
                    hresult = pclassinfo->getreftypeinfo( hreftype, &ptypein
fo );//  利用刚才取得句柄来取得typeinfo 注:这两步必须这样使用.
                    if( failed( hresult ) {return( hresult );}
                    trace( "events:\n" );
                    hresult = m_infoevents.init( ptypeinfo ); //  利用取得pt
ypeinfo来初始化控件的事件属性
                    //  注: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, &hr
eftype );
                      if( failed( hresult ) ){return( hresult );}
                      hresult = pclassinfo->getreftypeinfo( hreftype, &ptype
info );
                      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我.

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店