【问题标题】:Compare two instance of COM interface based on value根据值比较两个 COM 接口实例
【发布时间】:2012-12-21 05:27:24
【问题描述】:

关于如何根据两个 COM 对象的值(即私有状态)而不是其身份(即指向 IUnknown 的指针)来比较两个 COM 对象,是否存在既定模式?

【问题讨论】:

    标签: windows com


    【解决方案1】:

    对象相等是一个重要的实现细节,一个在 COM 中被很好地隐藏的细节。 COM 是一个基于接口的对象模型,这些接口需要实现的事实被小心地隐藏了。它只出现在几个地方,CoCreateInstance() 是显而易见的。不太明显的是 IUnknown 的规则。当您通过任何已实现的接口进行 QI 时,其正确实现要求您将获得相同的 IUnknown 接口指针。这提供了对象身份,而不是对象相等性。

    没有通常用于测试对象相等性的标准 COM 接口类型。你只需要自己做。一个带有 IsEqualTo() 方法的简单方法可以完成工作。或者您可以将该方法添加到您的默认界面中。

    【讨论】:

      【解决方案2】:

      这取决于“私人国家”的定义。 COM 对象不必有一个。如果对象实现IPersist* 系列接口,尤其是。 IPersistStreamInit,那么你可以将save都放到持久化流或者属性包中,然后直接比较存储,比如逐字节比较流。

      【讨论】:

      • 让我们假设有问题的对象具有私有状态(例如 std::list - 只是为了使序列化成为 100% 非选项...)
      • 所以你会将私有持久数据序列化为流,然后你将对流进行字节比较。
      • 那个声音太贵了……(尤其是非常大的物体)
      • 它很昂贵,因为您要求的是通用模式。特定类别的比较肯定会更有效。
      • 思考 .NET/Java 如何进行任意值比较:如果两个对象具有相同的类型,CLSID 不应该是一个指标吗? (假设我有一种可靠的方法从任何对象中提取该信息)。如果两个对象的 CLSID 相同,是否意味着它们具有相同的(内部)实现类型?
      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多