Pregunta

Me han desarrollado un complemento compartido para Excel usando la interfaz de extensibilidad IDTExtensibility2 en Visual Studio 2008.

Es bastante básico en la funcionalidad. Cuando se abre un libro de trabajo se almacena en una lista de libros de trabajo abiertos, cuando se cierra el complemento va a crear un nuevo archivo de texto a continuación, escribir algunos XML para el archivo, este archivo es leído por otro proceso que a su vez deserializar el XML .

El complemento funciona en las condiciones normales - por lo que si el usuario abre y cierra un archivo, entonces el complemento hace lo que debe, si dejan de Excel con los libros abiertos entonces se hace lo que debe

.

El problema es cuando el usuario tiene abierto Excel con los libros abiertos y hace un Log-Off. Los dos métodos:. OnDisconnection y OnBeginShutdown no parecen ser llamado, en absoluto

Hice dos cosas para probar esto:

  1. I creó una TextWriterTraceListener el que escribió a un archivo de registro cuando se llamaban estos dos métodos. Cuando Excel es dejar de fumar normalmente son golpeados y la información se registra en el archivo de registro, pero cuando un usuario cierra No hay nada en el archivo de registro.

  2. Dentro de estos dos métodos que utilizan File.CreateText (nombre de archivo) que crea un archivo en blanco. Cuando el usuario salga de Excel se crean normalmente estos archivos, pero una vez más, cuando Excel se cierra a través de un Registro-Off estos archivos no se crean.

¿Alguien tiene alguna idea de cómo puedo solucionar este problema? Necesito captura cuando Excel se cierra cuando el usuario inicia sesión fuera de su máquina ...

¿Fue útil?

Solución

La solución en el final fue a enganchar en Microsoft.Win32.SystemEvents.SessionEnding y, cuando fue despedido este evento del sistema, para llamar manualmente el método OnBeginShutdown.

Otros consejos

Esto se usa para hacer méthode ~ ~ objeto de error fracasado en VB6 días.

Trate WorkbookBeforeClose o potencialmente ProtectedViewWindowBeforeClose.

Uno de los problemas que pueda tener con estos si no recuerdo mal, es que no se pueden capturar cuando si el evento se cancela, por lo que si usted está usando esto para limpiar, yo creo que hay que hacer también algunos trabajos en uno de los eventos de activación o abiertas de manera que su complemento será útil si el usuario cancela la acción de cierre ....

Espero que esto tiene sentido.

Yo tenía el mismo problema con mi complemento de Outlook 2010. Puede ser algo que ver con el hecho de que Outlook 2010 no señal de complementos que se está cerrando .

Específicamente, Outlook [2010] ya no llama la OnBeginShutdown y OnDisconnection métodos de la interfaz IDTExtensibility2 durante el apagado rápido.

Del mismo modo, un complemento escrito con Microsoft Visual Studio Tools para Office Outlook ya no llama la ThisAddin_Shutdown método cuando Outlook se está cerrando.

Si todavía quiere que su complemento para ser notificado cuando Outlook 2010 se está cerrando (como yo), es necesario aferrarse a eventos Application del ApplicationEvents_Event_Quit, utilizando el código como el mío a continuación (el código de apagado todavía debe funcionar tanto en el OnDisconnection y OnBeginShutdown métodos, en cualquier 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...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top