12

我的Excel插件(XLL AddIn,叫它MyAddIn)是用 C#、ExcelDNA、NetOffice、VS2010 构建的。客户端有另一个插件(我们称之为B),我猜它是用 VBA 编写的。客户说B没有MyAddIn. 一旦MyAddIn安装,B失败并出现错误:

错误代码:406 错误消息:无法在此宿主应用程序中从 ActiveX DLL、ActiveX 控件或属性页显示非模态表单。

我确实看到了这个 Microsoft 资源,但我不想只是告诉客户B插件需要更改。我想做一些事情来避免这种情况发生。

以下是报告查看问题的步骤:

  1. 安装 B 插件后,它不会为 Microsoft Excel.
  2. 安装后MyAddin,它会为 Microsoft 生成一个注册表项Excel
  3. 这里的注册表项基本上告诉插件应该在启动时打开Excel,所以B插件没有启动,Excel工作正常,MyAddIn工作正常。
  4. 现在,当B插件启动时,它会给出上面显示的 406 错误。
  5. 我们可以忽略错误并继续使用B插件;禁用MyAddIn是解决方法。
  6. B插件启动时,我们看到它MyAddIn在插件之前先加载B,然后得到 406 错误。
  7. 当我们卸载时MyAddIn,不再遇到此错误,一切正常。
  8. 为了消除此错误,我们尝试更改注册表顺序以使B插件始终在MyAddin.
    • 这行得通,但这对 Microsoft 来说是一个全局更改Excel,这意味着B插件将始终打开,即使我们仅启动Excel。这是不希望的,因为B插件不能让用户使用静态数据,因为B插件会不断刷新实时。这就是B插件不在注册表设置中创建条目的原因。因此,注册表更改不是一种选择。我们不能总是在打开B时打开插件Excel
4

1 回答 1

1

我没有答案,但这里有几件事你可以尝试。

你可以通过执行File |来判断你正在处理什么类型的插件。选项并选择插件选项卡。

如果事件在您加载后立即发生Addin B,则可能意味着您正在调用它所声明的非模态对话框,但还有一些其他事情可能会给您带来类似的错误。

根据您的描述,听起来错误可能是您的插件中的一个对话框,也可能是其他插件中的错误,并且它被称为您的插件所做的某些状态更改的副作用。

要深入了解它,您需要附加一个调试器。您可以通过将 Excel 设为您的启动项目或稍后附加来做到这一点。在这种情况下,前者可能更容易。

  1. 在 Visual Studio 中,使用项目 | 属性 | Debug,选择Start external program并输入 Excel 的完全限定路径名。

  2. 手动加载Addin B给自己错误

  3. 进入调试器并检查调用堆栈。

这将经常但并不总是为您提供关于问题所在的好线索,但这始终是第一步。如果它没有为您提供有用的信息(堆栈信息经常在插件之间的转换中完全丢失),您可能希望在您处理的任何事件中在项目中放置一些断点。即使这样也不能一直可靠地工作,但值得一试。

如果我不得不猜测,我会说您的加载项中可能有一些导致问题的事件处理程序,并且您可能必须执行诸如将 a 更改.Show为“.ShowDialog”之类的操作,或者将表单的处理推迟到在事件处理程序之外,但这只是一个猜测。

于 2014-05-12T15:13:13.637 回答