荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店