Почему мы должны создавать уникальный uuid для каждого интерфейса в idl? - PullRequest
2 голосов
/ 24 февраля 2011

Почему мы должны создать уникальный uuid для каждого интерфейса в idl?

Например, в этом интерфейсе есть уникальный uuid для каждого интерфейса в TradingLib.

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
    };
};

Почему мы не можем просто использовать один uuid для самой библиотеки TradingLib?Почему необходимо создавать uuid для каждого интерфейса?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

когда вы запрашиваете экземпляр com-объекта, вы обычно делаете это, используя метод CreateInstance, а затем вызовите QueryInterface на этом объекте, чтобы получить ссылку на конкретный интерфейс этого объекта, который вам нужен. QueryInterface принимает значение uuid в качестве параметра. так что вы не можете использовать тот же гид для два районных интерфейса.

2 голосов
/ 24 февраля 2011

Каждый интерфейс COM должен иметь уникальный идентификатор, связанный с ним.Каждый раз, когда вы вводите новый интерфейс, вы должны назначать ему новый уникальный идентификатор.

Это одно из соглашений COM - если вы знаете идентификатор интерфейса, вы знаете, что такое интерфейс (все это метод с точными подписями).Таким образом, в вашем примере ответ таков: вы не можете повторно использовать идентификатор, потому что каждый отдельный интерфейс должен иметь свой собственный уникальный идентификатор.

2 голосов
/ 24 февраля 2011

В Windows UUID используется в реестре в качестве имени узла, где интерфейс зарегистрирован как существующий. Может быть больше причин, но это единственное место, где оно используется.

...