Назначение GUID в COM - PullRequest
       29

Назначение GUID в COM

2 голосов
/ 31 июля 2010

Для чего нужны GUID в COM?

Это только для того, чтобы избежать конфликтов имен?

Ответы [ 4 ]

5 голосов
/ 31 июля 2010

Служит точно так же, как имя.COM-клиент может попросить систему создать COM-объект, используя простой идентификатор (CoCreateInstance).Этот идентификатор имеет область действия полной машины.Различные куски кода, написанные программистами, которые не знают друг друга и работают в разных компаниях, живут в этой области.

Проблема с именами состоит в том, что люди сосут при выборе хороших имен.Вероятность того, что один программист выберет то же имя, что и другой программист, за 3000 миль и 5 лет назад высока.Такие имена, как «Запись», «База данных» и т. Д. Были бы популярным выбором.Очевидно, на этом сайте тоже много пользователей с именами «Джейсон» или «Майк».Они не возражают, они знают свое имя при просмотре своего профиля.Контекст.Я не могу найти их обратно, хотя, когда они отправляют мне электронное письмо только с их именем пользователя, в ответ на вопрос с общей строкой темы.

Получение коллизии имени и COM создает неправильно объект катастрофический.Программа перестает работать, потому что она получает совершенно неправильный объект.Выяснить, почему это сложно, сообщение об ошибке отстой.На самом деле исправить проблему невозможно.Позвонить программисту Б и попросить его самым дружелюбным способом «выбрать другое имя, кто-то уже выбрал ваше» не работает.Автоматический ответ - «вызовите программиста А».

Это не проблема, когда вы используете GUID вместо имени.Это глобально уникальные идентификаторы.Шансы на столкновение астрономически невелики.

1 голос
/ 31 июля 2010

Как следует из названия, это идентификатор и служит той же цели, что и любой другой идентификатор. Как вы упомянули, избегать конфликтов имен - одно из применений. Другое преимущество состоит в том, что длина его составляет всего 128 бит (по сравнению с именем, которое может быть произвольно длинным), поэтому сравнение двух идентификаторов GUID намного быстрее, чем сравнение их соответствующих имен.

1 голос
/ 31 июля 2010

Вероятно, так как это гарантирует глобально уникальный идентификатор для каждого объекта.

0 голосов
/ 02 августа 2010

Как следует из названия, GUID является глобально уникальным идентификатором. Это означает, что если один разработчик генерирует два GUID, он получает два разных GUID, и если два разработчика, которые даже не знают друг о друге, генерируют по одному GUID каждый - либо в один и тот же момент, либо в разные моменты - они снова получают два разных GUID. 1001 *

Теперь рассмотрим проблему - любой разработчик должен иметь возможность вводить новые интерфейсы и классы и делать их уникально идентифицируемыми. Это потому, что если вы получаете указатель на интерфейс, и ваша программа обрабатывает его как InterfaceA*, но на самом деле это не InterfaceA*, у вас есть серьезная проблема - ваша программа сталкивается с неопределенным поведением - вылетает или выдает неожиданные результаты. *

Вышеуказанная проблема легко решается с помощью GUID. Каждый разработчик создает новое (и, следовательно, уникальное) значение GUID для каждого нового интерфейса или класса, который он вводит. Это надежно и удобно (за исключением того, что GUID не настолько удобочитаемы).

...