Com 如何可靠地判断两个Inspector引用指向同一个Inspector实例?

Com 如何可靠地判断两个Inspector引用指向同一个Inspector实例?,com,outlook,identity,outlook-object-model,Com,Outlook,Identity,Outlook Object Model,[续自] 我从两个不同的来源获得了对Inspector对象的引用,并且需要能够区分一个来源中的哪个项目对应于另一个来源中的哪个项目。然而,到目前为止,我所能想到的方法都不起作用(可靠): 我不能这么做,因为inspector.Item()方法返回的是对动态创建的代理对象的引用,而不是inspector实例本身。试试看:访问同一个索引两次将返回两个截然不同的指针 比较Inspector.CurrentItem.EntryID也不好。新的/未保存的项目“EntryID始终为空,并且一次可能打开多个

[续自]

我从两个不同的来源获得了对
Inspector
对象的引用,并且需要能够区分一个来源中的哪个项目对应于另一个来源中的哪个项目。然而,到目前为止,我所能想到的方法都不起作用(可靠):

  • 我不能这么做,因为
    inspector.Item()
    方法返回的是对动态创建的代理对象的引用,而不是inspector实例本身。试试看:访问同一个索引两次将返回两个截然不同的指针

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

  • Inspector.Caption
    Inspector.CurrentItem.Subject
    同样模棱两可

  • 暂时将
    检查器.CurrentItem.Subject
    (或任何其他项目属性)设置为明确的值,然后在其他列表中查找该值,这样做是可行的,但会产生恼人的副作用,即在检查器中将项目标记为“脏”,即再次关闭检查器时,将要求用户保存该项目(即使他只是在查看收到的邮件)

还有其他想法吗


背景:

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


作为一种替代方法,我使用了一个shell钩子:现在,每当创建或销毁一个新的inspector窗口时,我都可以得到通知,这样就可以跳入并将我的内部包装器对象列表与
应用程序进行匹配。inspector
收集并相应地添加或删除新的或孤立的包装器对象。

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

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

您也可以使用Is操作符查看两个对象引用是否引用同一个对象杰特

例:


如果两个引用引用同一个检查器,这将在即时窗口中打印True

您也可以使用Is操作符查看两个对象引用是否引用同一对象

例:


如果两个引用引用同一个检查器,这将在即时窗口中打印True

是VB(A)代码吗?假设
Is
将转换为其他语言中的相等运算符,不幸的是,除非两个引用来自同一个源,否则这将不起作用(请参见我的第一个要点)。这就是这里的全部问题:一个引用是作为事件处理程序的参数获取的,另一个来自
应用程序。Inspectors
集合。在这种情况下,简单地比较这两个引用将始终将它们标识为不同的对象。是的,这是VBA代码。我不确定我是否理解您的反对意见对象不重要。如果两个对象引用都指向同一个对象,则相等运算符将返回True。我可以很容易地在事件处理程序中看到传递的引用和来自应用程序的引用。检查器指向同一个对象。此外,您可能希望使用正在使用的编程语言标记问题。这并不总是很清楚而且你可能不希望有人给你一个你无法使用的代码解决方案。这也让寻找这类问题的人更容易找到它们。好吧,问题的关键是源/做/重要,否则你的方法当然是不需要动脑筋的。。。(我仍然假设
只是VBA中对象的相等运算符)我认为问题在于Outlook在内部动态创建包装器对象,并将这些对象的引用交给您,而不是实际的底层对象,并且每次您请求它们时它都会这样做。因此,实际上,这些引用并不(直接)指向同一个对象。[tbc…][ctd…]如果VBA的
Is
-运算符确实可以克服这个问题,那么我真的很想知道引擎盖下到底发生了什么…那是VB(A)代码吗?假设
Is
将转换为其他语言中的相等运算符,不幸的是,除非两个引用来自同一个源,否则这将不起作用(另请参见我的第一个要点)。这就是这里的全部问题:一个引用是作为事件处理程序的参数获取的,另一个来自
应用程序。Inspectors
集合。在这种情况下,简单地比较这两个引用将始终将它们标识为不同的对象。是的,这是VBA代码。我不确定我是否理解您的反对意见对象不重要。如果两个对象引用都指向同一个对象,则相等运算符将返回True。我可以很容易地在事件处理程序中看到传递的引用和来自应用程序的引用。检查器指向同一个对象。此外,您可能希望使用正在使用的编程语言标记问题。这并不总是很清楚你可能不希望有人给你一个你无法使用的代码解决方案,这也让人们更容易寻找那些类型的qu
Debug.Print InspectorObj1 Is InspectorObj2