如何可靠地告诉两个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.Caption
或Inspector.CurrentItem.Subject
同样不明确。暂时将
Inspector.CurrentItem.Subject
(或任何其他项目属性)设置为明确的值,然后在其他列表中查找类型的作品,但具有在检查器中将项目标记为“脏”的烦人副作用,即在再次关闭检查员时,将要求用户保存该物品(即使他正在查看收到的邮件)。
还有其他想法吗?
语境:
我试图解决众所周知的bug /功能,通过简单MAPI发起新的电子邮件消息(例如发送至>在资源管理器右键菜单邮件收件人)做不会生成Inspectors.NewInspector
事件,因此无法为这些检查器添加任何插件功能(例如添加工具栏按钮或在消息创建时执行代码)。在我的COM插件中,我有一个包装对象的内部列表来捕获Inspector
-events。通过监视Inspectors.NewInspector
和Inspector.Close
事件,将项目添加到此列表并将其删除。
作为一种替代方法,我使用了一个shell钩子:无论何时创建或销毁一个新的检查器窗口,我现在都可以得到通知,这似乎是一个很好的选择,可以跳入并匹配我的内部包装列表包含Application.Inspectors
集合的对象,并相应地添加或删除新的或孤立的包装器对象。
我现在发现比较Inspector.CurrentItem.CreationTime
对我来说足够可靠。
您也可以使用是运算符来查看两个对象引用是否指向同一个对象。
例:
Debug.Print InspectorObj1 Is InspectorObj2
这将打印真立即窗口,如果两个引用指向同一个督察。
那是VB(A)代码吗?假设`Is`会翻译成其他语言的等号运算符,这将不幸的是,除非两个引用来自同一个源(也见我的第一个要点),否则这将不起作用。这就是整个问题:一个引用是作为事件处理程序的参数获得的,另一个引用来自Application.Inspectors集合。在这种情况下,简单地比较两者将*总是*将它们识别为不同的对象。 – 2011-11-09 11:37:01