[继续从有没有办法判断两个 COM 接口引用是否指向同一个实例?]
我有Inspector
来自两个不同来源的对象的引用,并且需要能够区分来自一个来源的哪个项目对应于来自另一个来源的哪个项目。但是,到目前为止,我想出的方法都没有(可靠):
我不能简单地比较
IUnknown
接口,因为该Inspectors.Item()
方法似乎返回了对动态创建的代理对象的引用,而不是检查器实例本身。试试看:两次访问同一个索引将返回两个截然不同的指针。比较
Inspector.CurrentItem.EntryID
也不好。新的/未保存的项目EntryID
始终为空白,一次可能有多个未保存的项目打开。Inspector.Caption
或者Inspector.CurrentItem.Subject
同样模棱两可。暂时将
Inspector.CurrentItem.Subject
(或任何其他项目属性)设置为明确的值,然后在其他列表类型的作品中查找该值,但具有将检查器中的项目标记为“脏”的烦人副作用,即在关闭检查器时将再次要求用户保存该项目(即使他只是查看收到的邮件)。
还有其他想法吗?
语境:
我正在尝试解决众所周知的错误/功能,即通过简单 MAPI 发起的新电子邮件消息(例如,资源管理器上下文菜单中的发送到>邮件收件人)不会生成Inspectors.NewInspector
事件,因此无法向那些添加任何插件功能检查员(例如添加工具栏按钮或在消息创建时执行代码)。在我的 COM 插件中,我有一个用于捕获事件的包装器对象的内部列表Inspector
。Inspectors.NewInspector
通过监视和Inspector.Close
事件将项目添加和删除到此列表中。
作为一种替代方法,我使用了一个 shell 钩子:我现在能够在创建或销毁新的检查器窗口时收到通知,因此这似乎是一个很好的地方,可以跳入并将我的内部包装对象列表与Application.Inspectors
集合匹配并相应地添加或删除新的或孤立的包装对象。