Com 为什么我们必须为idl中的每个接口创建唯一的uuid?

Com 为什么我们必须为idl中的每个接口创建唯一的uuid?,com,uuid,idl,Com,Uuid,Idl,为什么我们必须为idl中的每个接口创建唯一的uuid 例如,在此接口中,TradingLib中的每个接口都有一个唯一的uuid import "oaidl.idl"; [uuid(7C948DDC-8C22-46CF-91AD-1E043A0E1A10), object] interface IInventory : IUnknown { HRESULT GetStock([out, retval] long* pStock); HRESULT Buy([in] long qu

为什么我们必须为idl中的每个接口创建唯一的
uuid

例如,在此接口中,
TradingLib
中的每个接口都有一个唯一的uuid

import "oaidl.idl";

[uuid(7C948DDC-8C22-46CF-91AD-1E043A0E1A10), object]
interface IInventory : IUnknown
{
    HRESULT GetStock([out, retval] long* pStock);
    HRESULT Buy([in] long quantity, [in] float rate);
    HRESULT Sell([in] long quantity, [in] float rate);
};

[uuid(F7CF450D-C4BE-4943-A384-AA5BB4A89202), object]
interface IAccount : IUnknown
{
    HRESULT GetBalance([out, retval] double* pBalance);
    HRESULT Credit([in] double amount);
    HRESULT Debit([in] double amount);
};

[uuid(9791C352-4665-403C-8A37-3EC8485A87D5), version(1.0), helpstring("XYZ Trading Library")]
library TradingLib
{
    importlib("stdole32.tlb");

    [uuid(03698856-A173-417F-93CF-AEBC27EB042A)]
    coclass Trader
    {
        [default] interface IInventory;
        interface IAccount;
    };

    [uuid(E596BE02-0DCE-4B7C-B8D4-4F621F675BF0)]
    enum TradingErrors
    {
        TRADER_E_OUTOFSTOCK = 0x80040101,
        TRADER_E_INSUFFICIENTFUNDS = 0x80040102
    };
};
为什么我们不能为
TradingLib
库本身使用一个uuid呢?为什么需要为每个接口创建
uuid


谢谢。

在Windows中,UUID在注册表中用作节点名,接口在其中注册为现有。可能有更多的原因,但这是使用它的地方。

当您请求com对象的实例时,通常使用名为
CreateInstance
,然后在该Instance上调用
QueryInterface
,以获取对该对象上所需特定接口的引用。
QueryInterface
将uuid作为参数。因此,您不能对其使用相同的guid
两个不同的接口。

每个COM接口必须有一个与之相关联的唯一id。每次引入新接口时,都必须为其分配一个新的唯一id


这是COM约定之一——如果你知道一个接口id,你就知道接口是什么(它的所有方法都有精确的签名)。因此,在您的示例中,答案是-您不能重用id,因为每个不同的接口都必须有自己的唯一id。

这就是问题所在,为什么COM不能注册dll而不是注册每个接口?然后可以通过QueryInterface方法找到接口,这让我很困惑。问题是,COM就是要从契约中抽象出实现。因此,接口是唯一且不可变的。库不是这里的主实体。@Searock接口不属于库,因此接口的名称不足以识别它。UUID是唯一的,足以识别接口。@Searock Ruzario:从技术上讲,如果你不使用idl,你可以重用接口,而且它在大多数情况下都可以工作,但这是一种不好的做法。约定是给每个接口一个唯一的id,MIDL会强制执行。这相当于问“为什么我必须给程序中的类一个不同的名称?”接口的guid是名称,您使用的标识符只是为了方便起见,COM不会使用。