Надстройка Excel - OnDisconnection / OnBeginShutdown не вызывается при выходе из системы
-
09-10-2019 - |
Вопрос
Я разработал общую надстройку для Excel, используя расширяемый интерфейс IDTExtensibility2 в Visual Studio 2008.
Он довольно прост по функциональности.Когда книга открыта, она сохраняется в списке открытых книг, когда она закрыта, надстройка создаст новый текстовый файл, затем запишет в файл некоторый XML-файл, затем этот файл будет считан другим процессом, который затем десериализует XML.
Надстройка работает при обычных операциях - поэтому, если пользователь открывает и закрывает файл, то надстройка делает то, что должна, если они выходят из Excel с открытыми книгами, то она делает то, что должна.
Проблема возникает, когда пользователь открывает Excel с открытыми книгами и выходит из системы.Эти два метода:OnDisconnection и OnBeginShutdown, похоже, вообще не вызываются.
Я сделал две вещи, чтобы проверить это:
Я создал TextWriterTraceListener, который записывал данные в файл журнала при вызове этих двух методов.При выходе из Excel обычно они нажимаются, и информация заносится в файл журнала, но когда пользователь выходит из системы, в файле журнала ничего нет.
Внутри обоих этих методов используется File.CreateText(имя файла) Я создал пустой файл.Когда пользователь выходит из Excel, обычно эти файлы создаются, но опять же, когда Excel закрывается при выходе из системы, эти файлы не создаются.
У кого-нибудь есть какие-нибудь идеи, как я могу обойти эту проблему?Мне нужно зафиксировать, когда Excel закрывается, когда пользователь выходит из системы со своего компьютера...
Решение
Решение, в конце концов, состояло в том, чтобы подключиться к Microsoft.Win32.SystemEvents.SessionEnding
и, когда это Системное событие было запущено, вручную вызвать OnBeginShutdown
способ.
Другие советы
Раньше это вызывало ошибку methode ~ of object ~ failed в течение дней VB6.
Попробуйте WorkbookBeforeClose или потенциально ProtectedViewWindowBeforeClose.
Одна из проблем, с которыми вы можете столкнуться, если я правильно помню, заключается в том, что вы не можете зафиксировать, когда событие отменяется, поэтому, если вы используете это для очистки, я полагаю, вам также нужно выполнить некоторую работу в одном из событий activate или open, чтобы ваше дополнение можно было использовать, если пользователь отменит действие закрытия....
Надеюсь, в этом есть смысл.
У меня была такая же проблема с моей надстройкой Outlook 2010.Это может быть как-то связано с тем фактом, что Прогноз на 2010 год не делает сигнализируйте надстройкам о том, что они завершают работу.
В частности, Outlook [2010] больше не вызывает OnBeginShutdown ( Начало отключения) и При отключении связи методы интерфейса IDTExtensibility2 во время быстрого завершения работы.
Аналогично, надстройка Outlook, написанная с помощью Microsoft Visual Studio Tools для Office, больше не вызывает ThisAddin_Shutdown - Это дополнение метод при завершении работы Outlook.
Если вы по-прежнему хотите, чтобы ваша надстройка получала уведомления при завершении работы Outlook 2010 (как это сделал я), вам необходимо подключиться к Application
's ApplicationEvents_Event_Quit
событие, используя код, подобный моему ниже (ваш код завершения работы по-прежнему должен выполняться как в OnDisconnection
и OnBeginShutdown
методы, в любом случае):
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...
}