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

时间:2011-02-24 14:15:19

标签: 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 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

感谢。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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