Будем
представлять IID как константу,
идентифицирующую интерфейс, например:
static
const IID IID_IX =
{0x32bb8320, 0x6416, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80,0xc7,0xb2,0xd6, 0x82}};
На самом деле IIDпредставляет
тип, определенный как структура длиной 128 битов (16 байтов) под названием GUID. Для того, чтобы гарантировать уникальность
идентификатора интерфейса GUID использует 48-битовое
значение, уникальное для компьютера, на котором он генерируется. Обычно в
качестве такого значения берется адрес сетевой платы (60 битов GUID отводится для указания времени) в сочетании с множеством
других значений.
Уникальный GUID
можно сгенерировать программно с помощью двух утилит:
-утилита командной
строки UUIDGEN.EXE
-диалоговая
программа на VC++ GUIDGEN.EXE.
В COM
идентификаторы GUID используются для
идентификации классов компонента (CLSID),
интерфейсов (IID), библиотек типов и категорий
компонентов (CATID). Чтобы определить и
объявить GUID будем использовать макрос DEFINE_GUID, который
определен в OBJBASE.H. Для использования DEFINE_GUID генерируем GUID с помощью GUIDGEN.EXE. Макрос DEFINE_GUID создает глобальную константу, которая может быть
использована в любой программе, как на стороне клиента, так и на стороне
сервера. Однако ее значение определяется один раз. В той точке программы, в
которой требуется определить GUID-структуру,
необходимо перед файлом заголовков с объявлениями включить файл INITGUID.H. Приведем
пример:
//
// Imath.h
//
//{A888F561-58E4-11d0-A68A-0000837E3100
DEFINE_GUID (IID_IMath,
{ 0xa888f561, ... ... ...
class IMath: public IUknown
{
public:
virtual long Add(long Op1, long Op2)=0;
virtual long Substract(long Op1, long Op2)=0;
. . .
};
#include <objbase.h>
#include <initguid.h>
#include "Imath.h”
За счет включения в программу INITGUID.H мы отменяем
значение макроса DEFINE_GUID таким образом, что он не просто объявляет тип
переменной GUID(что-то вреде:
extern "C” const GUID IID_IMath),
а
создает и инициализирует переменную этого типа. Программа GUIDGEN открывает собственное окно и обеспечивает несколько
способов представления созданных GUID. В нашем
случае требуется формат DEFINE_GUID. Используя кнопку COPY, можно вставить определение GUID через буфер обмена непосредственно в исходный текст
программы.