2011-02-24 2 views
2

idl의 각 인터페이스에 대해 고유 한 uuid을 생성해야하는 이유는 무엇입니까?왜 IDL의 모든 인터페이스에 대해 고유 한 uuid를 만들어야합니까?

예를 들어이 인터페이스에는 모든 인터페이스에 대한 고유 한 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을 만들어야하는 이유는 무엇입니까?

감사합니다.

+2

"내 프로그램의 클래스에 별개의 이름을 지정해야하는 이유는 무엇입니까?"라는 질문과 같습니다. 인터페이스의 guid는 이름이며 사용하는 식별자는 사용자의 편의를 위해서만 사용되지만 COM에서는 사용하지 않습니다. –

답변

2

각 COM 인터페이스에는 고유 한 ID가 있어야합니다. 새 인터페이스를 소개 할 때마다 새 고유 ID를 지정해야합니다.

이것은 COM 규칙 중 하나입니다. 인터페이스 ID를 알고 있으면 인터페이스가 무엇인지 알 수 있습니다 (모든 것은 정확한 서명이있는 메소드입니다). 그래서 당신의 예제에서 대답은 - 각 고유 한 인터페이스가 고유 한 ID를 가져야하기 때문에 ID를 다시 사용할 수 없다는 것입니다.

2

Windows에서 UUID는 레지스트리에 기존 인터페이스가 등록 된 노드 이름으로 사용됩니다. 더 많은 이유가있을 수 있지만 이것이 사용되는 곳 중 하나입니다. 당신은 COM 개체의 인스턴스를 요청할 때

+0

그게 질문입니다. 왜 COM은 각 인터페이스를 등록하는 대신 dll을 등록 할 수 없습니까? 인터페이스 QueryInterface 메서드에 의해 찾을 수 있습니다,이 많이 혼란스러워. – Searock

+0

문제는 COM이 계약에서 구현을 추상화하는 것입니다. 그래서 인터페이스는 독특하고 불변입니다. 도서관은 여기 주요 주체가 아닙니다. – Menahem

+1

@Searock 인터페이스는 라이브러리가 소유하지 않으므로 인터페이스의 이름으로 식별 할 수 없습니다. UUID는 인터페이스를 식별 할만큼 고유합니다. –

3

, 당신은 일반적으로 당신이 필요로하는 개체의 특정 인터페이스에 대한 참조를 얻기 위해 그 instace에 QueryInterface를 호출 한 후 CreateInstance라는 방법을 사용하고, 할. QueryInterface은 uuid를 매개 변수로 취합니다. 그래서 당신은 동일한 지침을 두 개의 경계 인터페이스에 사용할 수 없습니다.