我自己用visual C++编写了一个ATL dll动态链接库,通过另一个exe程序来调用该DLL,如果返回S_FAIL 或者E_POINTER,程序就会崩溃。代码如下:hr=pGetRes->Calculate(……)
if(FAILED(hr)) AfxMessageBox(_T("失败的求取"));如果Calculate返回S_FAIL程序立马就异常中断了。从理论上讲应该可以进入下一行弹出“失败的求取”啊。dllATL HRESULT

解决方案 »

  1.   

    在微软的MSDN上有下面一条解释:当托管代码引发异常时,运行库将 HRESULT 传递给 COM 客户端。当非托管代码返回错误时,相应的 HRESULT 被转换为异常,然后由运行库引发该异常。我是用的Visual C++,应该属于非托管代码。难道是这个错误没能够传递给调用该dll的客户端?
      

  2.   

    你确定是返回了 E_FAIL ?
      

  3.   

    嗯,那个dll是我自己写的。如果避免返回E_FAIL造成主程序崩溃?
      

  4.   

    我觉得如此简单的代码,那么可能就是你 Calculate 异常了。
    不要期望避免返回 E_FAIL.
      

  5.   


    我的Calculate没有问题,这里返回的E_FAIL是我故意产生的,因为我在测试自己写的服务器dll和客户端exe,所以故意产生这个异常看看客户端会有什么问题。结果是只要遇到这个异常,程序就会意外中断,根本就没能进入if(FAILED(hr)) AfxMessageBox(_T("失败的求取"));的判断。
    截图:
    我希望我的exe当遇到这个E_FAIL时能够进行处理,而不是异常中断
      

  6.   


    找到原因了,是#import出错了
      

  7.   

    默认方法调用对错误会生成com_error异常,可以设置#import属性raw_interfaces_only关闭