ATL问题集-#15 ~ #16 (转)

ATL问题集-#15 ~ #16 (转)[@more@]

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

#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 - %sn", 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_MACHINESOFTWAREClassesCLSIDVerb
  1 =
  2 =
  3 =

以下是verb的格式:

Verb_Number =

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::DoVerb(iVerb, lpmsg,
  pActiveSite, lindex, hwndParent, lprcPosRect);
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-975245/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-975245/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值