3

uuididl のインターフェイスごとに固有のものを作成する必要があるのはなぜですか?

たとえば、このインターフェイスでは、すべてのインターフェイスに固有の 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
    };
};

TradingLibライブラリ自体に単一の uuid を使用できないのはなぜですか? uuidインターフェイスごとに作成する必要があるのはなぜですか?

ありがとう。

4

3 に答える 3

3

各COMインターフェイスには、一意のIDが関連付けられている必要があります。新しいインターフェースを導入するたびに、それに新しい一意のIDを割り当てる必要があります。

これはCOMの規則の1つです。インターフェイスIDがわかっている場合は、インターフェイスが何であるかがわかります(すべて正確な署名を持つメソッドです)。したがって、あなたの例では、答えは次のとおりです。各インターフェイスには独自の一意のIDが必要なため、IDを再利用することはできません。

于 2011-02-24T14:34:29.913 に答える
3

com オブジェクトのインスタンスを要求するときは、通常、 というメソッドを使用して実行し、そのインスタンスを CreateInstance呼び出しQueryInterfaceて、必要なオブジェクトの特定のインターフェイスへの参照を取得します。 QueryInterfaceパラメータとして uuid を取ります。したがって、2 つの異なるインターフェイスに同じ GUID を使用することはできません。

于 2011-02-24T14:33:13.483 に答える
2

Windows では、UUID は、インターフェイスが既存のものとして登録されるノード名としてレジストリで使用されます。他にも理由があるかもしれませんが、これはそれが使用される場所の 1 つです。

于 2011-02-24T14:25:47.623 に答える