Надстройка Excel - OnDisconnection / OnBeginShutdown не вызывается при выходе из системы

StackOverflow https://stackoverflow.com/questions/4378203

Вопрос

Я разработал общую надстройку для Excel, используя расширяемый интерфейс IDTExtensibility2 в Visual Studio 2008.

Он довольно прост по функциональности.Когда книга открыта, она сохраняется в списке открытых книг, когда она закрыта, надстройка создаст новый текстовый файл, затем запишет в файл некоторый XML-файл, затем этот файл будет считан другим процессом, который затем десериализует XML.

Надстройка работает при обычных операциях - поэтому, если пользователь открывает и закрывает файл, то надстройка делает то, что должна, если они выходят из Excel с открытыми книгами, то она делает то, что должна.

Проблема возникает, когда пользователь открывает Excel с открытыми книгами и выходит из системы.Эти два метода:OnDisconnection и OnBeginShutdown, похоже, вообще не вызываются.

Я сделал две вещи, чтобы проверить это:

  1. Я создал TextWriterTraceListener, который записывал данные в файл журнала при вызове этих двух методов.При выходе из Excel обычно они нажимаются, и информация заносится в файл журнала, но когда пользователь выходит из системы, в файле журнала ничего нет.

  2. Внутри обоих этих методов используется 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...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top