Excel中的HRESULT代码在C#中互操作

时间:2014-06-05 20:15:56

标签: c# excel error-handling interop hresult

我在使用带互操作的Excel时,正在寻找一种在C#中输出错误的简洁方法。

当文件不是"对" a有一条消息,比如" blabla HRESULT:0x800AC472 "。

我宁愿想要一条消息,例如" 使用的文件有这个或那个问题"。为了做到这一点,我需要知道每个HRESULT映射到哪个错误?

如何获得这样的错误列表?

我查看了MSDN,找到了一些说明,但我似乎无法找到所有代码的列表,例如" 0x800AC472 "提到上面。

1 个答案:

答案 0 :(得分:3)

我将Excel HRESULT代码0x800AC472设为VBA_E_IGNORE,表示Excel已暂停对象浏览器'。

在某些情况下,Excel将拒绝所有传入的COM请求。发生这种情况的两种情况是用户

  • 正忙于编辑公式,或
  • 按下Excel工作表上的鼠标按钮。

可能还有其他情况 - 例如,我不确定Excel忙于计算时的错误代码是什么。

如果您正在使用COM自动化与交互式使用的Excel实例进行通信,那么您对Excel所做的任何COM调用都可能会返回此错误。我使用Excel-DNA(其中互操作总是从Excel进程中的加载项发生)的一种方法是尝试调用Application.Run(...)来在加载项中运行宏。一旦Application.Run调用成功,宏将在主要Excel线程上运行,在该上下文中,由于Excel暂停COM调用,COM请求不会失败。

您可以从Excel中获得的其他一些COM错误是:

    const uint RPC_E_SERVERCALL_RETRYLATER = 0x8001010A;
    const uint RPC_E_CALL_REJECTED = 0x80010001; // Not sure when we get this one?
                                                 // Maybe when trying to get the Application object from another thread, 
                                                 // triggered by a ribbon handler, while Excel is editing a cell.
    const uint VBA_E_IGNORE = 0x800AC472;        // Excel has suspended the object browser
    const uint NAME_NOT_FOUND = 0x800A03EC;      // When called from the main thread, but Excel is busy anyway.