【问题标题】:How do I reliably tell that two Inspector references point to the same inspector instance?我如何可靠地判断两个 Inspector 引用指向同一个 Inspector 实例?
【发布时间】: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 IUnknown interfaces,因为似乎Inspectors.Item() 方法正在返回对动态创建代理对象的引用,而不是检查器实例本身。试试看:两次访问同一个索引将返回两个截然不同的指针。

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

  • Inspector.CaptionInspector.CurrentItem.Subject 同样是模棱两可的。

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

还有其他想法吗?


上下文:

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

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

【问题讨论】:

    标签: com outlook identity outlook-object-model


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      例如:

      Debug.Print InspectorObj1 Is InspectorObj2
      

      如果两个引用都指向同一个 Inspector,则会将 True 打印到即时窗口。

      【讨论】:

      • 那是 VB(A) 代码吗?假设Is 将转换为其他语言的相等运算符,不幸的是,除非两个引用来自同一来源(另请参阅我的第一个要点),否则这将不起作用。这就是这里的全部问题:一个引用作为事件处理程序的参数获得,另一个来自Application.Inspectors 集合。在这种情况下,简单地比较两者将总是将它们识别为不同的对象。
      • 是的,它是 VBA 代码。我不确定我是否理解你的反对意见。对象的来源应该无关紧要。如果两个对象引用都指向同一个对象,则相等运算符将返回 True。我可以很容易地看到事件处理程序中传递的引用和指向同一个对象的 Application.Inspectors 的引用。
      • 您可能还想用您正在使用的编程语言标记问题。这并不总是很清楚,您可能不希望有人给您一个您无法使用的代码解决方案。它还使寻找这类问题的人更容易找到它们。
      • 嗯,问题的重点是源 /does/ 重要,否则你的方法当然是不费吹灰之力......(我仍然假设is只是 VBA 中对象的相等运算符)我认为问题在于 Outlook 在内部动态创建包装器对象并将您引用到这些对象而不是实际的底层对象 - 每次您请求它们时它都会这样做。因此,实际上引用并没有(直接)指向同一个对象。 [待定...]
      • [ctd...] 如果 VBA 的 Is-operator 确实可以克服这个问题,那么我真的很想知道引擎盖下发生了什么...
      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2018-11-25
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      相关资源
      最近更新 更多