2011-02-24 57 views
2

爲什麼我們必須爲idl中的每個接口創建獨特的uuid爲什麼我們必須爲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

謝謝。

+2

這相當於問:「爲什麼我必須在我的程序中爲班級提供不同的名稱?」接口的guid是名字,你使用的標識符只是爲了你的方便,但不會被COM使用。 – 2011-02-24 14:48:15

回答

2

每個COM接口都必須有一個與之相關的唯一ID。每次您引入一個新界面時,您都必須爲其分配一個新的唯一ID。

這是COM約定之一 - 如果你知道一個接口id,你知道接口是什麼(所有的方法都有確切的簽名)。所以在你的例子中,答案是 - 你不能重用一個id,因爲每個不同的接口必須有它自己的唯一id。

2

在Windows中,UUID在註冊表中用作接口註冊爲現有的節點名稱。可能有更多的原因,但這是一個使用它的地方。

+0

這就是問題,爲什麼COM不能註冊dll而不是註冊每個接口?接口然後可以通過QueryInterface方法找到,這使我很困惑。 – Searock 2011-02-24 14:36:22

+0

事情是,COM就是從合約中抽離出實施。所以接口是獨一無二的。圖書館不是這裏的主要實體。 – Menahem 2011-02-24 14:39:54

+1

@Searock接口不屬於庫,所以接口的名稱不足以識別它。 UUID的唯一性足以識別接口。 – 2011-02-24 14:44:47

3

當你問一個COM對象的實例,你平時用它稱爲 CreateInstance方法,然後調用QueryInterface上instace去,你需要一個對象的特定接口的引用。 QueryInterface以uuid作爲參數。所以你不能使用相同的GUID爲 兩個distict接口。

相關問題