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



Почему мы должны создавать уникальные 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 для каждого интерфейса?



Спасибо.

475   3  

3 ответов:

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

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

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

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

Comments

    Ничего не найдено.