为什么COM接口为同一调用方法返回不同的值?

为什么COM接口为同一调用方法返回不同的值?,com,Com,当我在返回另一个接口的COM接口上调用一个方法时,punkVal每次都是不同的 然而,如果我使用老的punkVal调用接口方法,它也可以工作。似乎正在创建许多不必要的对象(或者可能是指向对象的指针),但我需要某种方法来确定返回的接口是否唯一。我所知道的是,我调用的是返回一个接口(punkVal),每个实例的值都不同。该值所指向的值总是相同的,但我认为这是因为它指向vtable或其他东西,似乎不是可靠的检查。甚至表面上完全不同的接口实际上都是同一个接口 要明确的是: someCOMInterfac

当我在返回另一个接口的COM接口上调用一个方法时,punkVal每次都是不同的

然而,如果我使用老的punkVal调用接口方法,它也可以工作。似乎正在创建许多不必要的对象(或者可能是指向对象的指针),但我需要某种方法来确定返回的接口是否唯一。我所知道的是,我调用的是返回一个接口(punkVal),每个实例的值都不同。该值所指向的值总是相同的,但我认为这是因为它指向vtable或其他东西,似乎不是可靠的检查。甚至表面上完全不同的接口实际上都是同一个接口

要明确的是:

someCOMInterface foo();

我在foo上调用invoke,并期望punkVal是某个ComInterface,稍后我必须在查询中使用invoke调用它的方法。但每次调用第一个调用时,我都会得到一个不同的someCOMInterface(调用返回的值“相同”但“不同”)。

这并不少见。对同一方法的多次调用返回的接口指针是否返回同一指针,完全取决于COM库的开发人员

返回不同指针的原因之一是特定COM库中使用的核心对象模型可能不是COM。例如,我用C++编写了对象模型,使用了代码“>代码”,SyddYPPTR < /Cord>,这可以为C++客户端提供更好的对象模型。但是,当我公开C++对象模型以实现互操作性(或者更一般地,将其暴露为DLL)时,COM通常是更好的选择。由于保持一个复杂的、层次化的对象模型与一组包装类的同步可能很困难,包装对象可能只是临时的——根据需要创建,并在客户端不再使用它们时销毁

在这些情况下,客户机可能仍然需要知道对象是“相等的”——两个不同的对象包装相同的内部对象可以被认为是“相等的”。为了确定这一点,Microsoft定义了接口。这个接口可以由COM包装类实现,这样客户机就可以显式地检查两个不相等的指针在概念上是否是“相等”的对象。您正在使用的对象可能实现也可能不实现此接口。显示了使用此接口确定对象相等性的完整示例

如果未实现
IObjectEquality
,则COM对象的开发人员应提供某种方法来进行此类确定,通常通过提供某种
名称
ID
或其他标识属性。例如,Excel的属性将从具有相同参数的后续调用返回不同的指针。要确定两个范围是否相等,可以使用该方法获取该范围的“标识符”,然后比较这些标识符