2

我在 Visual Studio 2008 中使用 Extensibility IDTExtensibility2 接口为 Excel 开发了一个共享插件。

它的功能非常基本。打开工作簿时,它存储在打开的工作簿列表中,当它关闭时,插件将创建一个新的文本文件,然后将一些 XML 写入文件,然后由另一个进程读取该文件,然后反序列化 XML .

该插件在正常操作下工作 - 因此,如果用户打开和关闭一个文件,那么插件会做它应该做的事情,如果他们在打开工作簿的情况下退出 Excel,那么它会做它应该做的事情。

问题是当用户打开 Excel 并打开工作簿并注销时。这两种方法: OnDisconnection 和 OnBeginShutdown 似乎根本没有被调用。

我做了两件事来测试这个:

  1. 我创建了一个 TextWriterTraceListener,它在调用这两个方法时写入了一个日志文件。当 Excel 正常退出时,它们会被命中并且信息会记录在日志文件中,但是当用户注销时,日志文件中没有任何内容。

  2. 在这两种使用 File.CreateText(filename) 的方法中,我创建了一个空白文件。当用户正常退出 Excel 时,会创建这些文件,但同样,当通过注销关闭 Excel 时,不会创建这些文件。

有谁知道如何解决这个问题?当用户注销他们的机器时,我需要捕获 Excel 何时关闭...

4

3 回答 3

1

最终的解决方案是挂钩Microsoft.Win32.SystemEvents.SessionEnding,并在触发此 System 事件时手动调用该OnBeginShutdown方法。

于 2011-04-01T13:27:32.937 回答
0

我的 Outlook 2010 插件也有同样的问题。这可能与Outlook 2010没有发出正在关闭的加载项信号有关

具体来说,Outlook [2010] 在快速关机期间不再调用 IDTExtensibility2 接口的OnBeginShutdownOnDisconnection方法。

同样,使用 Microsoft Visual Studio Tools for Office 编写的 Outlook 加载项在Outlook 关闭时不再调用ThisAddin_Shutdown方法。

如果您仍然希望在 Outlook 2010 关闭时通知您的插件(就像我所做的那样),您需要使用下面的代码锁定Application'sApplicationEvents_Event_Quit事件(您的关闭代码仍应在OnDisconnectionOnBeginShutdown方法中运行,任何状况之下):

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
    // As this is an Outlook-only extension, we know the application object will be an Outlook application
    _applicationObject = (Microsoft.Office.Interop.Outlook.Application)application;

    // Make sure we're notified when Outlook 2010 is shutting down
    ((Microsoft.Office.Interop.Outlook.ApplicationClass)_applicationObject).ApplicationEvents_Event_Quit += new ApplicationEvents_QuitEventHandler(Connect_ApplicationEvents_Event_Quit);
}

private void Connect_ApplicationEvents_Event_Quit()
{
    Array emptyCustomArray = new object[] { };
    OnBeginShutdown(ref emptyCustomArray);
}

public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
{
    addinShutdown();
}

public void OnBeginShutdown(ref System.Array custom)
{
    addinShutdown();
}

private void addinShutdown()
{
    // Code to run when addin is being unloaded, or Outlook is shutting down, goes here...
}
于 2011-10-04T15:23:30.407 回答
0

这曾经在 VB6 天中导致方法 ~ of object ~ failed 错误。

尝试 WorkbookBeforeClose 或可能的 ProtectedViewWindowBeforeClose。

如果我没记错的话,您可能遇到的一个问题是,如果事件被取消,您将无法捕捉到,所以如果您使用它来清理,我相信您还需要在其中一个中做一些工作激活或打开事件,以便您的插件在用户取消关闭操作时可用....

希望这是有道理的。

于 2010-12-07T15:46:31.880 回答