2010-12-07 7 views
2

J'ai développé un Addin partagé pour Excel en utilisant l'interface Extensibilité IDTExtensibility2 dans Visual Studio 2008.Excel Addin - OnDisconnection/OnBeginShutdown pas appelé logoff

Il est assez basique dans la fonctionnalité. Quand un classeur est ouvert, il est stocké dans une liste de classeurs ouverts, quand il est fermé, 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 désérialise le XML . L'addin fonctionne normalement - si l'utilisateur ouvre et ferme un fichier alors l'addin fait ce qu'il devrait, s'il quitte Excel avec des classeurs ouverts, il fait ce qu'il devrait faire.

Le problème est lorsque l'utilisateur ouvre Excel avec des classeurs ouverts et qu'il se déconnecte. Les deux méthodes: OnDisconnection et OnBeginShutdown ne semblent pas du tout appelées.

J'ai fait deux choses à tester cela:

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

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

Est-ce que quelqu'un a des idées pour contourner ce problème? J'ai besoin de capturer quand Excel est fermé lorsque l'utilisateur se déconnecte de leur machine ...

Répondre

1

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

0

Ceci utilisé pour provoquer une erreur de méthode ~ d'objet ~ en VB6 jours.

Essayez WorkbookBeforeClose ou potentiellement ProtectedViewWindowBeforeClose. Un problème que vous pouvez avoir avec ceux-ci si je me souviens bien, c'est que vous ne pouvez pas capturer si l'événement est annulé, donc si vous utilisez cette fonction pour nettoyer, je crois que vous devez aussi faire un peu de travail dans l'un des événements d'activation ou d'ouverture de sorte que votre addin sera utilisable si l'utilisateur annule l'action de fermeture ....

Espérons que cela a du sens.

+0

J'utilise déjà WorkbookBeforeClose, dans une manière détournée, mais comme un test je l'ai changé pour qu'il se connecter à mon TextWriterTraceListener quand on l'appelle. Lorsque Excel se ferme normalement, le message de débogage est écrit dans le journal. Toutefois, lorsque Excel est fermé via le journal d'utilisateur, le message de débogage n'est pas écrit dans le fichier journal – kzhen

+0

En outre, il n'explique toujours pas pourquoi OnDisconnection et OnBeginShutdown pas appelé ... – kzhen

0

J'ai eu le même problème avec mon addin Outlook 2010. C'est peut-être quelque chose à voir avec le fait que Outlook 2010 does not signal add-ins that it is shutting down.

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

De même, un complément Outlook écrit avec Microsoft Visual Studio Tools pour Office n'appelle plus la méthode ThisAddin_Shutdown lors de la fermeture d'Outlook.

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 de ApplicationEvents_Event_QuitApplication, en utilisant le code comme le mien ci-dessous (votre code d'arrêt devrait toujours fonctionner dans les deux méthodes 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... 
}