2011-07-14 42 views
1

我在Delphi XE中編寫了這個代碼,它從GUID const分配接口的GUID。代碼編譯好,但我想知道這是否是一個有效的聲明?關於爲接口分配GUID的問題

const 
    IID_IFoo: TGUID = '{00000000-6666-6666-6666-666666666666}'; 
type 
    IFoo = interface(IDispatch) 
    [IID_IFoo] 
    //properties 
    //methods 
    end; 

回答

2

可以做到這一點,但問題是爲什麼你想?

如果您希望引用接口的GUID而不是接口的名稱,那麼只要該接口具有關聯的IID(GUID),那麼可以使用TGUID所在的接口名稱:

type 
    IFoo = interface(IDispatch) 
    ['{00000000-6666-6666-6666-666666666666}'] 
    //properties 
    //methods 
    end; 

// meanwhile, elsewhere in the project... 

    sFooIID := GUIDToString(IFoo); 

這是接口的少「嘈雜」的宣言,並避免了可能會聲明/引用IID常數實際上未與接口有關的,你認爲這是可能的(或沒有被與IID完全相關)。

const 
    IID_Foo = '{00000000-6666-6666-6666-666666666666}'; 
    IID_Bar = '{00000000-6666-6666-6666-777777777777}'; 

type 
    IFoo = interface(IDispatch) 
    [IID_Bar] // WHOOPS! 
    : 
    end; 

    IBar = interface(IDispatch) 
    // WHOOPS again!! 
    : 
    end; 


// Meanwhile, elsewhere in the project 

sBarID := GUIDToString(IID_Bar); // Works, but is the IID of IFoo, not IBar 
sFooID := GUIDToString(IID_Foo); // Works, but is an IID not associated with any interface 

使用接口本身既是接口 IID,而不是具有單獨的常量聲明,消除了這些錯誤的可能性。

當使用單獨的常量的聲明IID的 - 如果你絕對要 - 你可以通過使用接口從未最更小,其中預計IID的對這些問題的一個保護。但是,這無疑使事情在錯誤的IID已被用於特定接口的情況更糟:

// Cannot make the mistake of using an interface as a GUID if it has no IID at all 

sBarID := GUIDToString(IBar); // Does not compile - IBar has no IID 


// But if it's the wrong IID then you get results that are "correct" but not expected: 

a := GUIDToString(IFoo); 
b := GUIDToString(IID_Foo); 

    a <> b 
+0

我看不出你認爲那樣嚴重的危險,但我確實認爲將IID內聯爲文字更具慣用性。 –

+0

這是你看不到的危險,通常會把你趕出去。 ;) (但是請注意,可能更難得一遇的危險比真正的高風險 - 即使是這樣,爲什麼引進了這種危險的可能性時,有沒有必要) – Deltics

+0

@Deltics原因之一申報GUID常數獨立於界面如圖Delphi的一個解決方法不允許你聲明一個接口類型的常量。請參閱[本問答](http://stackoverflow.com/a/704645/224704)。 –

2

是的,這是完美的罰款。如果你想知道爲什麼你應該在界面中使用GUID,請檢查This

編輯

您可以確保它的工作原理。只需使用QueryInterface使用GUID,你會看到它的問題

+0

感謝@Rafael,我知道爲什麼我必須接口使用的GUID,我只是關心的聲明。 – Salvador

+0

沒問題,很高興我能幫到你。 –