Domanda

Ho sviluppato un componente aggiuntivo condiviso per Excel utilizzando l'interfaccia estensibilità IDTExtensibility2 in Visual Studio 2008.

E 'piuttosto semplice in termini di funzionalità. Quando una cartella di lavoro si apre è memorizzato in un elenco di cartelle di lavoro aperti, quando è chiuso il componente aggiuntivo creerà un nuovo file di testo quindi scrivere alcune XML al file, questo file viene letto da un altro processo che poi deserializzare il XML .

Il componente aggiuntivo funziona sotto il normale funzionamento - quindi se l'utente apre e chiude un file, quindi il componente aggiuntivo fa quello che dovrebbe, se uscire da Excel con le cartelle di lavoro aperte allora fa quello che dovrebbe

.

Il problema è quando l'utente ha aperto con Excel le cartelle di lavoro aperti e fa un Log-Off. I due metodi:. OnDisconnection e OnBeginShutdown non sembrano essere chiamati, a tutti

Ho fatto due cose per testare questo:

  1. ho creato un TextWriterTraceListener, che ha scritto in un file di registro quando questi due metodi sono stati chiamati. Quando Excel è smettere di solito vengono colpiti e le informazioni vengono registrate nel file di registro, ma quando un utente si disconnette non c'è niente nel file di registro.

  2. All'interno entrambi questi metodi che utilizzano File.CreateText (nome del file) ho creato un file vuoto. Quando l'utente chiude Excel si creano normalmente questi file, ma ancora una volta, quando Excel viene chiuso attraverso una disconnessione questi file non vengono creati.

Qualcuno ha qualche idea come posso risolvere questo problema? Ho bisogno di cattura quando Excel viene chiuso quando l'utente accede al largo la loro macchina ...

È stato utile?

Soluzione

La soluzione alla fine è stato nell'agganciarsi Microsoft.Win32.SystemEvents.SessionEnding e, quando questo evento System è stato generato, per chiamare manualmente il metodo OnBeginShutdown.

Altri suggerimenti

Questo usato per causare un Methode ~ dell'oggetto ~ errore fallito in giorni VB6.

Prova WorkbookBeforeClose o potenzialmente ProtectedViewWindowBeforeClose.

Un problema che si può avere con questi, se non ricordo male, è che non è possibile acquisizione quando se l'evento viene annullato, quindi se si sta utilizzando questo per ripulire, credo che è necessario fare anche un po 'di lavoro in una delle attivare o eventi aperti in modo tale che il tuo componente aggiuntivo sarà utilizzabile se l'utente annulla l'azione di chiusura ....

Spero che questo ha un senso.

Ho avuto lo stesso problema con il mio Outlook 2010 componente aggiuntivo. Potrebbe essere qualcosa a che fare con il fatto che Outlook 2010 non segnale di componenti aggiuntivi che si sta spegnendo .

  

In particolare, Outlook [2010] non chiama il OnBeginShutdown e OnDisconnection metodi dell'interfaccia IDTExtensibility2 durante l'arresto rapido.

     

Allo stesso modo, un componente aggiuntivo di Outlook scritto con Microsoft Visual Studio Tools per Office non chiama più il ThisAddin_Shutdown metodo quando Outlook si sta spegnendo.

Se si vuole ancora il tuo componente aggiuntivo per essere avvisati quando Outlook 2010 si sta spegnendo (come ho fatto io), è necessario attaccarsi all'evento Application del ApplicationEvents_Event_Quit, utilizzando il codice come la mia di seguito (il codice di shutdown dovrebbe comunque funzionare in entrambe le OnDisconnection e OnBeginShutdown metodi, in ogni caso):

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...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top