问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-18 07:04

我来回答

1个回答

热心网友 时间:2022-04-18 08:33

我们需要在容器中获得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:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 带点字怎么读?它们的部首是什么? 一点一横部首怎么读 点这个字怎么读? 初中女生住校必备物品 初中女生住宿需要什么? 初中女生住宿需要带什么啊! 初中女生住宿要准备什么 女生初中住宿必备? 我是一个准备上初中的女生,肯定少不了住宿,请问住宿需要准备些什么东西,详细一点的 到超市买的馒头放了1天半就有的长黑点,有的长荧光色的点,还有黄毛,这是不是用硫磺熏的? 初一要住宿,女生,要准备些什么? 体寒会有哪些症状?对身体有什么影响? 体内寒气重有什么表现?应该怎样去除体内寒气? 女人体寒有哪些表现 体寒究竟会有哪些表现呢? 中医说的体寒有哪些表现啊? 寒气重的人会有哪些症状? 请问一下淘宝店铺手机号如何修改 淘宝店铺换电话号码有影响吗? 白椰子脏了怎么清洗 怎么让宫灯长寿花开花不断? 宫灯长寿花的养殖秘诀是什么呢? 宫灯长寿花的颜色是什么? 这是什么花?叫啥?怎么养? 长寿花叶子发白怎么回事,看起来病恹恹的,带花的那张是刚买回来的时候的样子? 长寿花为什么不开花只长叶子? 宫灯长寿花老枯叶,花也是。是怎么回事啊? 水彩画手机软件 手机的WPS怎么压缩图片 让2.5M的图片变到几百K 急! 用什么绘画软件画水彩水粉最好? 大家没有知道的画水彩效果好的小软件。 那种可以把照片打马赛克打成水彩画画的图片软件叫什么 电脑上画画的软件,可以画水彩水粉,素描之类的 画,大家有用过的嘛 什么手机软件可以画出水彩艺术效果? 月经来喝咖啡有影响吗 姨妈来可以喝咖啡吗 那个来了可以喝咖啡吗? 来姨妈可以喝咖啡嘛 月经来了喝咖啡会有害吗? 月经来了可以喝咖啡吗