Question

J'ai développé un Addin partagé pour Excel en utilisant l'interface Extensibilité IDTExtensibility2 dans Visual Studio 2008.

Il est assez basique dans la fonctionnalité. Lorsqu'un classeur est ouvert, il est stocké dans une liste des classeurs ouverts, lorsqu'il est fermé le Addin va créer un nouveau fichier texte puis écrire du XML dans le fichier, ce fichier est ensuite lu par un autre processus qui sera ensuite désérialiser le XML .

Le Addin fonctionne en fonctionnement normal - donc si l'utilisateur ouvre et ferme un fichier, puis le Addin fait ce qu'il doit, s'ils quittent Excel avec les classeurs ouverts, puis il fait ce qu'il faut

.

Le problème est lorsque l'utilisateur a Excel ouvert avec les classeurs ouverts et fait un Déconnexion. Les deux méthodes:. OnDisconnection et OnBeginShutdown ne semblent pas être appelé, tout

Je l'ai fait deux choses à tester ceci:

  1. Je créé un TextWriterTraceListener qui écrit dans un fichier journal lorsque ces deux méthodes ont été appelés. Lorsque Excel est normalement quitter ils sont touchés et les informations sont enregistrées dans le fichier journal, mais quand un utilisateur se déconnecte il n'y a rien dans le fichier journal.

  2. Dans ces deux méthodes en utilisant File.CreateText (nom de fichier) j'ai créé un fichier vide. Lorsque l'utilisateur quitte Excel normalement ces fichiers sont créés, mais encore une fois, lorsque Excel est fermé par une déconnexion de ces fichiers ne sont pas créés.

Est-ce que quelqu'un a des idées comment je peux contourner ce problème? Je dois capture lorsque Excel est fermé lorsque l'utilisateur déconnecte leur machine ...

Était-ce utile?

La solution

La solution à la fin était de crochet dans Microsoft.Win32.SystemEvents.SessionEnding et, lorsque cet événement système a été déclenché, pour appeler manuellement la méthode de OnBeginShutdown.

Autres conseils

Cela provoquait un Methode ~ ~ d'objet erreur a échoué dans les jours VB6.

Essayez WorkbookBeforeClose ou potentiellement ProtectedViewWindowBeforeClose.

Une question que vous pourriez avoir avec ceux-ci, si je me souviens bien, est que vous ne pouvez pas capturer quand si l'événement est annulé, donc si vous utilisez cette fonction pour nettoyer, je crois que vous devez aussi faire quelques travaux dans l'un des événements ou Activate ouverts tels que votre Addin sera utilisable si l'utilisateur annule l'action de fermeture ....

Espérons que cela fait sens.

J'ai eu le même problème avec mon Addin Outlook 2010. Il peut être quelque chose à voir avec le fait que Outlook 2010 ne pas add-ins signal qu'il est en train de fermer .

  

Plus précisément, Outlook [2010] n'appelle plus OnBeginShutdown et OnDisconnection méthodes de l'interface IDTExtensibility2 lors de l'arrêt rapide.

     

De même, un complément dans Outlook écrit avec Microsoft Visual Studio Tools pour Office n'appelle la méthode ThisAddIn_Shutdown lorsque Outlook est en cours d'arrêt.

Si vous voulez toujours votre Addin pour être averti lorsque Outlook 2010 est en cours d'arrêt (comme je l'ai fait), vous devez accrocher à l'événement Application de ApplicationEvents_Event_Quit, en utilisant le code comme le mien ci-dessous (votre code d'arrêt doit toujours fonctionner dans les deux Modes de OnDisconnection et OnBeginShutdown, dans tous les cas):

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...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top