分享
 
 
 

ATL问题集-#15 ~ #16

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

/*此文是我将网上的一些文章,自已遇到的问题进行整理,有些是翻译,所有只供学习讨论,如有版权还属于原作者——作者:黄森堂*/

#15 在COM/ATL中如何处理错误?

基于Windows的组件都有支持ISupportErrorInof接口,它允许将组件的错误信息返回给客户端,在VC5以后提供了本地的支持,如下:

_com_error( HRESULT hr, IErrorInfo* perrinfo = NULL ) throw( );

_com_error( const _com_error& that ) throw( );

这个函数检查IErrorInfo接口指针年是否存在,如果存在将抛出_com_error异常对象,你只要捕获这个_com_error异常对象就要以了,以下是示例代码:

STDMETHODIMP CMessageHandler::NewMessage(BSTR inMessage, BSTR inTo,

BSTR inFrom, BSTR inReply)

{

HRESULT hr = S_OK;

try

{

......

if(FAILED(hr))

_com_error(hr);

}

catch (_com_error& e) {

hr = Error((BSTR)e.Description(), e.HelpContext(), e.HelpFile(),e.GUID(), e.Error());

ATLTRACE("com error: %d - %s\n", e.Error(), (const char*)e.Description());

}

return hr;

}

至于返回错误信息到客户端,请参阅我的《COM的错误处理》(也在文档中心)。

#16 如何自定义控件的Verbs?

Microsoft标准文档定义了OLE对象从容器中响应消息,在一个对象容器或客户端链接到对象,通常是调动IOleObject::DoVerb()来响应用户或容器的消息,你可以通过双击对象或点击鼠标右键的上下文菜单来提供的选择来操作,容器对象装入上下文菜单是通过调用IOleObject::EnumVerbs().

典型的服务对象或控件是在IOleObject::EnumVerbs()的实现中调用OleRegEnumVerbs(),ATL默认实现了这些功能,但你必须按照以下步骤:

1.首先添加菜单项到.RGS文件中,verb关键字存储在注册,如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Verb

\1 = <verb1>

\2 = <verb2>

\3 =

以下是verb的格式:

Verb_Number = <Verb_String, Menu_Flag, Verb_Flag>

Verb_Number是个枚举类型,Verb_String是有效的字符串,像"属性",Menu_Flag描述如何调用::AppendMenu,Verb_Flag是OLEVERBATTRIB枚举类型的值之一,如下:

OLEVERBATTRIB_NEVERDIRTIES = 1,

OLEVERBATTRIB_ONCONTAINERMENU = 2

所以请修改你的.RGS文件,如下:

NoRemove CLSID

{

ForceRemove {E14A8DEA-8C72-11D1-891C-00C04FA3FB11} = s 'X Class'

{

ProgID = s 'X.X.1'

VersionIndependentProgID = s 'X.X'

ForceRemove 'Programmable'

...

'verb'

{

'1' = s '&Play,0,2'

'2' = s '&Transpose,0,2'

'3' = s '&Detune,0,2'

'4' = s '&Properties,0,2'

}

...

}

}

当容器检测到作过在对象上的verb操作将调用IOleObject::DoVerb(),在ATL,你需要覆盖IOleObjectImpl::DoVerb(),如下:

STDMETHOD(DoVerb)(LONG iVerb,

LPMSG lpmsg,

IOleClientSite *pActiveSite,

LONG lindex,

HWND hwndParent,

LPCRECT lprcPosRect)

{

if (iVerb == 1)//The verb number mentioned in the .rgs file

{

//Do whatever you want

}

else if(iVerb == 2)

{

}

?

?

return IOleObjectImpl<ClassName>::DoVerb(iVerb, lpmsg,

pActiveSite, lindex, hwndParent, lprcPosRect);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有