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