COM的烦恼! 能否举个c++或vc容错功能的例子. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 编译器对一些COM用法无法检查出错误,只能记住不能这么用。 编译器是c++编译器,又不是com编译器,com不是语言.只要你语法不错误,编译器才不管你应用逻辑上的错误.com本身有自己的错误处理方法.下面是摘自vcmfc的笔记.在这里我主要提COM的原始处理方法与ATL提供的处理方法,至于MFC,可能也就差不多了。1.COM的原始处理方式: 由于COM是与语言的无关性,COM提供了返回码HRESULT,HRESULT定义为一个简单的长整形,即一个32位的值,它由3部分组成:用途、严重性、状态码.Microsoft提供了一些有用的宏定义来辅助操作,其中MAKE_HRESULT是用来将用途、严重性、状态码组合成HRRESULT值,其参数请参考MSDN。但由于在高级语句中HRESULT不能很多地工作,因为这些语句将HRESULT值隐藏起来,在这些语句中,错误是作为异常而不是返回码来进行处理。当在这些语句中进行编程时,它提供的错误信息太少了,为了克服这一陷,COM提供了IErrorInfo,ICreateError和ISupportErrorInof接口,在ATL Object Wizard的属性中Attribute的Support ISupportErrorInfo打钩就可以了,然后在你的程序中需要返回错误信息的地方加入以下代码:ICreateErrorInfo *pErrorInfo=NULL;CreateErrorInfo(&pErrorInfo);pErrorInfo->SetGUID(IID_IEncrypt);//你的组件对象的GUIDpErrorInfo->SetSource(L"ASPEncrypt.Encrypt");pErrorInfo->SetDescription(A2W((char*)szErrorText));//出错说明信息IErrorInfo *pErrInfo=NULL;//第一个参数一定是IID_IErrorInfo,不是你的GUID,不乱写。pErrorInfo->QueryInterface(IID_IErrorInfo,(void**)&pErrInfo);SetErrorInfo(0,pErrInfo);pErrInfo->Release();pErrorInfo->Release();//::GetLastError();可换成你的错误ID;return MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,::GetLastError());2.ATL提供的错误处理方式: ATL可真是简单之极,它把上面的全包装起来,就是使用CComCoClass::Error就可以了,如下:// return Error(A2W((char*)szErrorText),IID_IEncrypt,::GetLastError());vc中还提供_com_error用来处理com错误. Rich Edit控件显示BMP图片 mfc单文档界面拆分问题 网络数据传输-用什么压缩算法更好? 请教各位,如何编程实现网络带宽监测!!! VC入门级问题 用depends看dll中函数时,函数的排列顺序问题 求救:关与VC中.h和.cpp的关系. 重装系统后原来的源代码无法编译,在线求救... 如何把汇编程序转化为c语言的????? VC++操作EXCEL中关于range.cut和range.copy问题 我该怎样获得显示器能支持的颜色数,是256?还是其它 能不能截获directx游戏中的文本
只要你语法不错误,编译器才不管你应用逻辑上的错误.
com本身有自己的错误处理方法.下面是摘自vcmfc的笔记.
在这里我主要提COM的原始处理方法与ATL提供的处理方法,至于MFC,可能也就差不多了。1.COM的原始处理方式: 由于COM是与语言的无关性,COM提供了返回码HRESULT,HRESULT定义为一个简单的长整形,即一个32位的值,它由3部分组成:用途、严重性、状态码.Microsoft提供了一些有用的宏定义来辅助操作,其中MAKE_HRESULT是用来将用途、严重性、状态码组合成HRRESULT值,其参数请参考MSDN。但由于在高级语句中HRESULT不能很多地工作,因为这些语句将HRESULT值隐藏起来,在这些语句中,错误是作为异常而不是返回码来进行处理。当在这些语句中进行编程时,它提供的错误信息太少了,为了克服这一陷,COM提供了IErrorInfo,ICreateError和ISupportErrorInof接口,在ATL Object Wizard的属性中Attribute的Support ISupportErrorInfo打钩就可以了,然后在你的程序中需要返回错误信息的地方加入以下代码:
ICreateErrorInfo *pErrorInfo=NULL;
CreateErrorInfo(&pErrorInfo);
pErrorInfo->SetGUID(IID_IEncrypt);//你的组件对象的GUID
pErrorInfo->SetSource(L"ASPEncrypt.Encrypt");
pErrorInfo->SetDescription(A2W((char*)szErrorText));//出错说明信息
IErrorInfo *pErrInfo=NULL;
//第一个参数一定是IID_IErrorInfo,不是你的GUID,不乱写。
pErrorInfo->QueryInterface(IID_IErrorInfo,(void**)&pErrInfo);
SetErrorInfo(0,pErrInfo);
pErrInfo->Release();
pErrorInfo->Release();
//::GetLastError();可换成你的错误ID;
return MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,::GetLastError());2.ATL提供的错误处理方式: ATL可真是简单之极,它把上面的全包装起来,就是使用CComCoClass::Error就可以了,如下:
// return Error(A2W((char*)szErrorText),IID_IEncrypt,::GetLastError());vc中还提供_com_error用来处理com错误.