Вопрос о назначении GUID для интерфейса - PullRequest
1 голос
/ 15 июля 2011

Я написал этот код в Delphi XE, который назначает GUID интерфейса из GUID const.код компилируется нормально, но я хочу знать, является ли это допустимым объявлением?

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

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Вы можете сделать это, но вопрос в том, зачем вам это нужно?

Если вы хотите обратиться к 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, вместо того, чтобы иметь отдельное объявление const, устраняют вероятность этих ошибок.

При использовании отдельных объявлений констант для 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
2 голосов
/ 15 июля 2011

Да, это прекрасно. Если вы хотите знать, почему вы должны использовать направляющие в интерфейсах, отметьте This out.

EDIT

Вы можете убедиться, что это работает. Просто используйте QueryInterface с помощью guid, и вы увидите, что это

...