Уникальная
идентификация объектов
Данные типа
GUID (globally unique identifier) являются 128-битными идентификаторами,
состоящими из пяти групп шестнадцатеричных цифр,' которые обычно генерирует
специальная программа uuidgen, входящая в инструменты Studio.Net. Например,
если вы в командной строке Windows наберете
uuidgen
-n2 -s >guids.txt
то
в файле guids.txt получите два уникальных числа вида:
{12340001-4980-1920-6788-123456789012}
{1234*0002-4980-1920-6788-123456789012}
которые можно
использовать в качестве ключа регистрации в Windows-реестре. Рекомендуется обращаться
к утилите uuidgen и просить сразу много идентификаторов, а затем постепенно
использовать их (помечая, чтобы не забыть) в своем приложении для идентификации
интерфейсов, СОМ-классов и библиотек типов. Это упрощает отладку, поиск в реестре
и, возможно, его чистку. Кроме этого способа существуют и другие. Например,
можно обратиться к функции
HRESULT
CoCreateGuid(GUID *pguid);
которая гарантированно
выдаст уникальное 128-битное число, которое не совпадет ни с одним другим числом,
полученным в любой вычислительной системе, в любой точке планеты, в любое время
в прошлом и будущем. Впечатляюще, не правда ли? Есть целая серия функций вида
Uuid* из блока RFC-API, которые генерируют и обрабатывают числа типа GUID. Число,
как вы видите, разбито на пять групп, как-то связанных с процессом генерации,
в котором задействованы время генерации, географическое место, информация о
системе и т. д. Следующие типы переменных эквивалентны типу GUID:
- CLSID — используются
для идентификации СОМ-классов;
- IID — используются для
идентификации СОМ-интерфейсов;
- UUID (Universally Unique
Identifiers) — используются в RPC (Remote Procedure Calls) библиотеках для
идентификации клиентов и серверов, а также интерфейсов.
Тип IID используется
также и для идентификации библиотек типов. Переменные типа GUID являются структурами,
содержащими четыре поля. Тип GUID определен в guiddef.h следующим образом:
typedef
struct
{
//===
1-я группа цифр (8 цифр - 4 байта)
unsigned
long Datal;
//===
2-я группа цифр (4 цифры - 2 байта)
unsigned
short Data2;
//===
3-я группа цифр (4 цифры - 2 байта)
unsigned
short Data3;
//===
4-я и 5-я группы (4 и 12 цифр) - 8 байт
byte
Data4[8];
}
GUID;
Мы уже обсуждали
необходимость уникальной идентификации интерфейсов. Ну а зачем уникально идентифицировать
классы? Предположим, что два разработчика создали два разных СОМ-класса, но
оба назвали их MySuperGrid. Так как СОМ узнает класс по его CLSID, а алгоритм
генерации CLSID гарантирует его уникальность, то совпадение имен не мешает использовать
оба класса в одном клиентском приложении. Система пользуется двумя типами GUID:
строковым (применяется в реестре) и числовым (нужен клиентским приложениям).
Я думаю, что
в этот момент у неискушенного СОМ-технологией читателя должна слегка закружиться
голова. Это нормально, так как по заявлению авторитетов (David Cruglinsky),
она будет кружиться в течение примерно полугода, при условии регулярного изучения
СОМ-технологий.