我使用Visual Studio 2008中的扩展性IDTExtensibility2接口开发了Excel的Shared Addin。
这在功能上非常基础。当打开工作簿时,它将存储在已打开的工作簿列表中,当它关闭时,addin将创建一个新的文本文件,然后将一些XML写入该文件,然后该文件将由另一个进程读取,然后该进程将反序列化XML
addin在正常操作下工作 - 所以如果用户打开和关闭文件,那么addin会做它应该做的事情,如果他们用打开的工作簿退出Excel,那么它就会做它应该做的事情。
问题是当用户使用打开的工作簿打开Excel并执行注销时。两种方法:OnDisconnection和OnBeginShutdown似乎根本没有被调用。
我做了两件事来测试这个:
我创建了一个TextWriterTraceListener,它在调用这两个方法时写入日志文件。当Excel退出时,它们会被点击并且信息会记录在日志文件中,但是当用户注销时,日志文件中没有任何内容。
在使用File.CreateText(filename)的这两种方法中,我创建了一个空白文件。当用户退出Excel时,通常会创建这些文件,但是再次通过注销关闭Excel时,不会创建这些文件。
有没有人有任何想法如何解决这个问题?当用户注销他们的机器时,我需要捕获当Excel关闭时...
答案 0 :(得分:1)
最后的解决方案是挂钩Microsoft.Win32.SystemEvents.SessionEnding
,当触发此System事件时,手动调用OnBeginShutdown
方法。
答案 1 :(得分:0)
用于导致VB6天内对象〜失败错误的方法。
尝试使用WorkbookBeforeClose或可能的ProtectedViewWindowBeforeClose。
如果我没记错的话,你可能会遇到的一个问题是你无法捕捉到事件被取消的时间,所以如果你用它来清理,我相信你还需要做一些工作激活或打开事件之一,如果用户取消关闭操作,您的插件将可用....
希望这是有道理的。
答案 2 :(得分:0)
我的Outlook 2010插件遇到了同样的问题。这可能与Outlook 2010 does not signal add-ins that it is shutting down。
这一事实有关具体而言,Outlook [2010]在快速关闭期间不再调用IDTExtensibility2接口的 OnBeginShutdown 和 OnDisconnection 方法。
同样,在Outlook关闭时,使用Microsoft Visual Studio Tools for Office编写的Outlook加载项不再调用 ThisAddin_Shutdown 方法。
如果您仍希望在Outlook 2010关闭时通知您的插件(就像我一样),您需要使用下面的代码来锁定Application
的{{1}}事件(在任何情况下,您的关机代码仍应以ApplicationEvents_Event_Quit
和OnDisconnection
方式运行:
OnBeginShutdown