【问题标题】:Why do we have to create unique uuid for every interface in a idl?为什么我们必须为 idl 中的每个接口创建唯一的 uuid?
【发布时间】:2011-07-03 14:37:51
【问题描述】:

为什么我们必须为 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

谢谢。

【问题讨论】:

  • 相当于问“为什么我必须给程序中的类起一个不同的名字?”接口的 guid 是名称,您使用的标识符只是为了您的方便,不会被 COM 使用。

标签: com uuid idl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 问题来了,为什么COM不能只注册dll而不是注册每个接口呢?然后可以通过QueryInterface方法找到接口,这让我很困惑。
      • 事实是,COM 就是从合约中抽象出实现。所以接口是唯一且不可变的。图书馆不是这里的主要实体。
      • @Searock 接口不归库所有,因此接口的名称不足以识别它。 UUID 是唯一的,足以识别一个接口。
      • @Searock Ruzario:嗯,从技术上讲,如果您不使用 idl,您可以重用接口,并且它在大多数情况下都可以工作,但这是不好的做法。惯例是你给每个接口一个唯一的 id,MIDL 会强制你这样做。
      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多