2010-12-07 73 views
2

我一直在使用扩展IDTExtensibility2接口,在Visual Studio中开发了一个共享的加载项为Excel 2008Excel加载项 - OnDisconnection/OnBeginShutdown不叫注销

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

的插件工作在正常操作下 - 因此,如果用户打开和关闭文件,然后将插件做什么应该,如果他们退出Excel与打开的工作簿,然后它做什么,它应该。

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

我做了两件事情来测试:

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

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

有没有人有任何想法我可以解决这个问题?我需要在用户注销他们的机器...

回答

1

最终的解决方案是挂钩到Microsoft.Win32.SystemEvents.SessionEnding,并且在启动此系统事件时手动调用OnBeginShutdown方法。

0

这曾经引起了Methode捕捉时被关闭的Excel〜对象的〜在VB6天失败的错误。

尝试使用WorkbookBeforeClose或潜在的ProtectedViewWindowBeforeClose。你可能有这些

一个问题,如果我没记错的话,是当如果事件被取消,你永远不能捕捉到的,所以如果你想利用这个来收拾,我相信你也需要做一些工作在激活或打开事件,如果用户取消关闭动作你的插件将可用的一个....

希望这是有道理的。

+0

,在四围的方式,但作为一个测试,我改变了它,这样它会登录到我的TextWriterTraceListener会时它被称为。当Excel正常退出时,调试消息将写入日志中,但是,通过用户注销关闭Excel时,调试消息不会写入日志文件 – kzhen 2010-12-07 16:27:01

0

我有同样的问题,我的Outlook 2010的插件。这可能与Outlook 2010 does not signal add-ins that it is shutting down这个事实有关。

具体地,展望[2010]不再调用快速关机期间IDTExtensibility2接口的OnBeginShutdownOnDisconnection方法。

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

如果仍希望在展望2010年时关闭(像我一样)通知你的插件,你需要锁定到ApplicationApplicationEvents_Event_Quit事件,使用像我下面的代码(你关机的代码应该仍然在OnDisconnectionOnBeginShutdown方法均运行在任何情况下):我已经使用WorkbookBeforeClose

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... 
}