¿Cómo puedo decir de manera confiable que dos referencias de Inspector apuntan a la misma instancia de inspector?

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

Pregunta

[continúa de ¿Hay alguna manera de saber si dos referencias de interfaz COM apuntan en la misma instancia? ]

Tengo referencias a objetos Inspector de dos fuentes diferentes y necesito saber qué elemento de una fuente corresponde a qué elemento de la otra fuente. Sin embargo, ninguno de los enfoques que he podido desarrollar hasta ahora funcionó (de manera confiable):

  • No podría simplemente comparar las interfaces IUnknown ya que parece que el < El método code> Inspectors.Item () está devolviendo una referencia a un objeto proxy creado sobre la marcha en lugar de la instancia del inspector en sí. Pruébelo: acceder dos veces al mismo índice devolverá dos punteros claramente diferentes.

  • Comparar Inspector.CurrentItem.EntryID tampoco es bueno. El EntryID de un elemento nuevo / no guardado siempre está en blanco y podría haber más de un elemento no guardado abierto a la vez.

  • Inspector.Caption o Inspector.CurrentItem.Subject también es ambiguo.

  • Establece temporalmente Inspector.CurrentItem.Subject (o cualquier otra propiedad de elemento realmente) en un valor inequívoco y luego busca eso en el otro tipo de lista de trabajos pero tiene el lado molesto- efecto de marcar el artículo en el inspector como "sucio", es decir, al cerrar el inspector nuevamente, se le pedirá al usuario que guarde el artículo (incluso si solo estaba viendo un correo recibido).

¿Alguna otra idea?


Context:

Estoy tratando de evitar el conocido error / función que los nuevos mensajes de correo electrónico iniciados a través de MAPI simple (por ejemplo, Enviar a > Destinatario de correo en el menú contextual del Explorador) no generan un Inspectores. > evento, lo que hace que sea imposible agregar ninguna funcionalidad adicional a esos inspectores (por ejemplo, agregar botones de la barra de herramientas o ejecutar código en la creación de mensajes). En mi complemento COM, tengo una lista interna de objetos de contenedor para capturar los eventos Inspector . Los elementos se agregan y eliminan a esta lista al monitorear los eventos Inspectors.NewInspector y Inspector.Close .

Como método alternativo, estoy usando un gancho de shell: ahora puedo recibir notificaciones cada vez que se crea o destruye una nueva ventana de inspección, por lo que parece ser un buen lugar para saltar y hacer coincidir mi lista interna de objetos de envoltura con la colección Application.Inspectors y agregue o elimine objetos de contenedor nuevos o huérfanos en consecuencia.

¿Fue útil?

Solución

Ahora descubrí que comparar Inspector.CurrentItem.CreationTime era lo suficientemente confiable para mí.

Otros consejos

También puede usar el operador Es para ver si dos referencias de objeto se refieren al mismo objeto.

Ej:

Debug.Print InspectorObj1 Is InspectorObj2

Esto imprimirá Verdadero en la Ventana Inmediata si ambas referencias se refieren al mismo Inspector.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top