2011-07-14 6 views
1

このコードは、GUID constからインターフェイスのGUIDを割り当てるDelphi XEで作成しました。コードをコンパイルしてもOKですが、これが有効な宣言であれば分かりますか?インターフェイスへのGUIDの割り当てに関する質問

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

答えて

2

これを行うのはなぜですか?

あなたはそのインターフェイスが関連付けられているIID(GUID)を持っている限り、その後、インターフェイスの名前ではなく、インターフェイスのGUIDを参照したい場合、あなたはTGUIDが期待されているインタフェース名を使用することができます

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

// meanwhile, elsewhere in the project... 

    sFooIID := GUIDToString(IFoo); 

これはあまり「ノイズの多い」インターフェイスの宣言であり、実際にはインターフェイスと関連付けられていない(または実装されていない)IID定数を宣言または参照する可能性を回避します。そのIIDには全く関係しません)。インターフェース IIDはなく、別のconst宣言を有する両方としてインターフェース自体を使用

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が期待されるインターフェイスを使用することでこれらの問題の1つに対して保護することができます。私はインターフェイスにGUIDを使用しなければならない理由@Rafaelが、私は本当に知っているおかげで、私は宣言についてちょうど心配です

// 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 GUID定数をインタフェースとは別に宣言する1つの理由は、次のような理由によるものです。(つまり、必要性がない場合には、なぜそれらの危険性が生じるのでしょうか?) – Deltics

+0

Delphiの回避策では、インターフェイス型の定数を宣言することができません。 [このQ&A](http://stackoverflow.com/a/704645/224704)を参照してください。 –

2

はい、これは問題ありません。インターフェイスでguidを使用する理由を知りたい場合は、Thisをチェックしてください。

EDIT

あなたはそれが動作することを確認することができます。 guidを使用してQueryInterfaceを使用すると、worlが表示されます。

+0

:しかし、これは間違いなく間違ったIIDは、特定のインターフェイスのために使用されてきた場合には、物事を悪化させます。 – Salvador

+0

問題なし、うれしいことにあなたを助けることができました。 –

関連する問題