¿Cómo puedo decir de manera confiable que dos referencias de Inspector apuntan a la misma instancia de inspector?
-
11-07-2019 - |
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. ElEntryID
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
oInspector.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.
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.