2011-05-23 61 views
2

基于此回答:Catching COMException specific Error Code,我想知道,如果我只需要查看异常的特定部分,就可以正确处理跨操作系统和多个版本的OL的COMException。例如,如何处理Outlook插件中的HRESULT?

private const uint HRESULT_OPERATIONABORTED = 0x80004004; 

// ... 

    try { 
     // something that could throw COMExceptions 
    } catch (System.Runtime.InteropServices.COMException e) { 

     switch ((uint)e.ErrorCode) { 

      case HRESULT_OPERATIONABORTED: 
       break; 

      default: 
       break; 
     } 
    } 

这是足够的跨平台,或者是有必要只考虑错误代码的一部分吗?

编辑 - 只是为了澄清,我确切的问题是,是否比较(uint)e.ErrorCode0x80004004太具体的(也就是说,是否我总是得到0x80004004此特定错误,无论OS/OL),或者如果这是做事情的正确方法。

回答

0

就跨平台兼容而言,您几乎没有什么可担心的,COM只能在Windows上运行。同样,错误代码是一个明确定义的错误代码。您可以在WinError.h SDK头文件中查找标准COM错误代码。它是E_ABORT。我建议你实际使用该标识符。

您会在c:\ program files \ microsoft sdks \ windows \ v6.0 \ include中找到此标头。 VS2010是v7.0。

+0

我只是说,XP和Win7之间。感谢标题,这正是我需要的。 – wes 2011-05-23 23:27:01

0

您可能还需要考虑捕获System.OutOfMemoryException和COM对象返回的HRESULT结果的其他异常。并非所有失败的HRESULT都会导致COMException。

对于我所见过的大多数MAPI错误,错误代码与标准C MAPI头文件中声明的内容不同,所以我认为switch语句没问题。换句话说,该方法不应该比C编写的MAPI客户端应用程序更不兼容。