| |
||
| ::首页 >> 文档中心 >> 在线杂志 >> COM技术(COM/DCOM/COM+) | [ 在线杂志 第44期 ] | |
| |
|
1.HRESULT是32位的,分三个部分,既严重程度,设备代码,错误代码, 其中严重程度其实只有一位(第31位),而不是两位, 而设备代码有15位,错误代码有16位,你所讲的是WINDOWS的错误代码格式,而非HRESULT的代码格式 2.对象支持不支持异常,并不要求要实现ISupportErrorInfo接口,也就是说不实现这个接口也可以SetErrorInfo,和GetErrorInfo,之所以实现这个接口主要的目的是用来检测某个接口的方法会不会抛出异常,而不是接口要抛出COM异常,就一定需要实现ISupportErrorInfo ( obq0387_cn 发表于 2005-10-3 11:44:00) IErrorInfo* ErrorInfo = NULL; if (SUCCEEDED (GetErrorInfo (0, &ErrorInfo))) { ErrorInfo->GetDescription (&Description); ErrorInfo->GetSource (&Source); ErrorInfo->GetHelpFile (&HelpFile); ErrorInfo->GetHelpContext (&HelpContext); ErrorInfo->Release (); } throw EOleException (Description, ErrorCode, Source, HelpFile, HelpContext); } } } 通过它可以转换本机COM+组件的异常,但是不同机器的异常它又还是处理不到,只能返回HRESULT,但是不能取得具体的内容。 希望杨老师指点!非常感谢!! ( jAmEs_ 发表于 2005-9-3 11:26:00) { if (FAILED (hr) && (HRESULT_FACILITY (hr) == FACILITY_ITF)) { bool HasErrorInfo = false; if (Object && (!IsEqualGUID (ErrorIID, GUID_NULL))) { ISupportErrorInfo* SupportErrorInfo = NULL; HRESULT hr = Object->QueryInterface (IID_ISupportErrorInfo, (void**)&SupportErrorInfo); if (SUCCEEDED (hr)) { if (SupportErrorInfo->InterfaceSupportsErrorInfo (ErrorIID) == S_OK) HasErrorInfo = true; SupportErrorInfo->Release (); } } else HasErrorInfo = true; if (HasErrorInfo) { int ErrorCode = hr; WideString Description, Source, HelpFile; ULONG HelpContext = 0; 待续。。。 ( jAmEs_ 发表于 2005-9-3 11:26:00) 然后COM调用SetErrorInfo,把HRESULT返回客户端,这个HRESULT我不知道怎么转换为字符,也就是对应的内容~ 我在网上找到一个函数: 待续。。。 ( jAmEs_ 发表于 2005-9-3 11:24:00) 你时指.tli文件里面,调用_com_issue_errorex产生异常吗? 但是我不知道_com_issue_errorex的实现代码~BCB里面,我不能直接使用这个函数,编译会找不到它的实现,BCB里面带一个comutil.cpp,它里面有函数的实现: void _stdcall _com_issue_errorex(HRESULT hr, IUnknown*, REFIID) throw(_com_error){ /* what's the right thing to do here? probably *not* what we're doing, but without a test case ... Can someone who is using this please send email to rwest@borland.com explaining *how* it's being used and what you want from it? :) */ throw _com_error(hr); } 我用这个代码编译正常,但是,结果并没有取得COM抛出的具体内容,所以我认为这个函数的实现不太正确。 待续。。。 ( jAmEs_ 发表于 2005-9-3 11:23:00) 感谢你的回复! 我想再问问,在COM(+)抛出异常的时候,如执行完SetErrorInfo以后,返回一个HRESULT,这个值不等于0,客户端为何能使用 try { } catch(...) { } 的结构去截取错误的呢?实际上说,HRESULT也不过是个数值,它并没有抛出异常。 难道客户端程序自动在当返回不等于0的值时,就throw一个异常出来?那它依据什么来throw呢?机制又是什么呢? 不好意思,我的问题多了点,但是我觉得搞清楚这个,那在BCB上的问题应该就有思路了。 ( jAmEs_ 发表于 2005-8-30 16:08:00) to [zhao_dazhi] 大志您好:) ( 杨老师 发表于 2005-8-28 14:42:00) ....................................................... More... |