如何可靠地告诉两个Inspector引用指向相同的检查器实例?

问题描述:

[从Is there a way to tell whether two COM interface references point at the same instance?续]如何可靠地告诉两个Inspector引用指向相同的检查器实例?

我从两个不同的渠道获得引用Inspector对象,并需要能够判断哪些项目从一个源对应于从其他来源哪个项目。然而,没有我已经能够拿出这么远的方法的工作(可靠):

  • 我不能简单地作为compare the IUnknown interfaces它似乎Inspectors.Item()方法返回到基准创建的上即时代理对象而不是检查器实例本身。试一试:访问相同的索引两次将返回两个明显不同的指针。

  • 比较Inspector.CurrentItem.EntryID也不好。新/未保存的项目'EntryID始终为空,并且可能有多个未保存的项目一次打开。

  • Inspector.CaptionInspector.CurrentItem.Subject同样不明确。

  • 暂时将Inspector.CurrentItem.Subject(或任何其他项目属性)设置为明确的值,然后在其他列表中查找类型的作品,但具有在检查器中将项目标记为“脏”的烦人副作用,即在再次关闭检查员时,将要求用户保存该物品(即使他正在查看收到的邮件)。

还有其他想法吗?


语境:

我试图解决众所周知的bug /功能,通过简单MAPI发起新的电子邮件消息(例如发送至>在资源管理器右键菜单邮件收件人)做不会生成Inspectors.NewInspector事件,因此无法为这些检查器添加任何插件功能(例如添加工具栏按钮或在消息创建时执行代码)。在我的COM插件中,我有一个包装对象的内部列表来捕获Inspector -events。通过监视Inspectors.NewInspectorInspector.Close事件,将项目添加到此列表并将其删除。

作为一种替代方法,我使用了一个shell钩子:无论何时创建或销毁一个新的检查器窗口,我现在都可以得到通知,这似乎是一个很好的选择,可以跳入并匹配我的内部包装列表包含Application.Inspectors集合的对象,并相应地添加或删除新的或孤立的包装器对象。

我现在发现比较Inspector.CurrentItem.CreationTime对我来说足够可靠。

您也可以使用运算符来查看两个对象引用是否指向同一个对象。

例:

Debug.Print InspectorObj1 Is InspectorObj2 

这将打印立即窗口,如果两个引用指向同一个督察。

+0

那是VB(A)代码吗?假设`Is`会翻译成其他语言的等号运算符,这将不幸的是,除非两个引用来自同一个源(也见我的第一个要点),否则这将不起作用。这就是整个问题:一个引用是作为事件处理程序的参数获得的,另一个引用来自Application.Inspectors集合。在这种情况下,简单地比较两者将*总是*将它们识别为不同的对象。 – 2011-11-09 11:37:01