Windows 基于值比较COM接口的两个实例

Windows 基于值比较COM接口的两个实例,windows,com,Windows,Com,是否有一个既定的模式,可以根据两个COM对象的值(也称为私有状态)而不是它们的标识(也称为指向IUnknown的指针)来比较它们?这取决于“私有状态”的定义。COM对象不必有一个。如果对象实现了IPersist*接口系列,特别是IPersistStreamInit,那么您可以将两者都放入持久流或属性包中,然后直接比较存储,例如逐字节比较流。对象相等性是一个沉重的实现细节,在COM中隐藏得很好。COM是一个基于接口的对象模型,这些接口需要实现的事实被仔细隐藏。它只出现在几个地方,CoCreateI

是否有一个既定的模式,可以根据两个COM对象的值(也称为私有状态)而不是它们的标识(也称为指向IUnknown的指针)来比较它们?

这取决于“私有状态”的定义。COM对象不必有一个。如果对象实现了
IPersist*
接口系列,特别是
IPersistStreamInit
,那么您可以将两者都放入持久流或属性包中,然后直接比较存储,例如逐字节比较流。

对象相等性是一个沉重的实现细节,在COM中隐藏得很好。COM是一个基于接口的对象模型,这些接口需要实现的事实被仔细隐藏。它只出现在几个地方,CoCreateInstance()显然是其中之一。不太明显的是IUnknown的规则。其正确的实现要求您在通过任何实现的接口时获得相同的IUnknown接口指针。这提供了对象标识,而不是对象相等


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

让我们假设所讨论的对象具有私有状态(例如std::list-只是为了使序列化成为100%非选项…),所以您将私有持久数据序列化到流中,然后对流进行字节比较。这听起来非常昂贵。。。(特别是对于非常大的对象)这是非常昂贵的,因为您需要一个通用模式。特定于类的比较可能更有效。想想.NET/Java如何进行任意值比较:如果两个对象具有相同的类型,CLSID不应该是一个指示符吗?(假设我有可靠的方法从任何对象提取该信息)。如果两个对象的CLSID相同,这不意味着它们具有相同的(内部)实现类型吗?