[继续Is there a way to tell whether two COM interface references point at the same instance?]
我已经从两个不同的来源引用了Inspector
个对象,并且需要能够分辨出一个来源中的哪个项目与另一个来源中的哪个项目相对应。然而,到目前为止,我所能提出的方法都没有(可靠地)起作用:
我不能简单地compare the IUnknown
interfaces,因为似乎Inspectors.Item()
方法正在返回对即时创建的代理对象的引用,而不是检查器实例本身。试一试:两次访问相同的索引将返回两个截然不同的指针。
比较Inspector.CurrentItem.EntryID
也不好。新的/未保存的商品“EntryID
始终为空白,并且一次可能会打开多个未保存的商品。
Inspector.Caption
或Inspector.CurrentItem.Subject
同样含糊不清。
暂时将Inspector.CurrentItem.Subject
(或其他任何项目属性)设置为明确的值,然后在其他列表中查找该类型的工作,但是会产生令人讨厌的副作用。检查员为“脏”,即再次关闭检查员后,将要求用户保存该项目(即使他只是查看收到的邮件)。
还有其他想法吗?
上下文:
我正在尝试解决众所周知的错误/功能,即通过简单MAPI启动的新电子邮件(例如,在资源管理器上下文菜单中发送给>邮件收件人)不会生成Inspectors.NewInspector
事件,从而使其成为可能无法向这些检查员添加任何插件功能(例如,添加工具栏按钮或在创建消息时执行代码)。在我的COM-addin中,我有一个包含对象的内部列表来捕获Inspector
- 事件。通过监控Inspectors.NewInspector
和Inspector.Close
事件,将项目添加到此列表中。
作为替代方法,我正在使用shell挂钩:我现在能够在创建或销毁新检查器窗口时收到通知,这样就可以跳转并匹配我的内部包装器对象列表使用Application.Inspectors
集合并相应地添加或删除新的或孤立的包装器对象。
答案 0 :(得分:1)
我现在发现比较Inspector.CurrentItem.CreationTime
对我来说足够可靠。
答案 1 :(得分:0)
您还可以使用是运算符来查看两个对象引用是否指向同一个对象。
例如:
Debug.Print InspectorObj1 Is InspectorObj2
如果两个引用都引用同一个Inspector,则会将 True 打印到立即窗口。