Могут ли несколько ProgID указывать на один и тот же ClsID?

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

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

Итак, вопросы:

  1. Это приемлемая техника? (несколько ProgIDs все указывают на один ClsID).
  2. Когда мой плагин загрузится, сможет ли он определить, какой ProgID был использован для его создания?

1 ответ

Решение

Идентификаторы программ обычно используются двумя способами: для определения идентификатора класса, соответствующего идентификатору программы (функция CLSIDFromProgID()) - это используется для последующего вызова CoCreateInstance() - и для определения идентификатора программы для данного идентификатора класса - это обычно используется для отображения понятной для человека версии идентификатора класса.

Эти сопоставления подразумевают, что существует ключ HKCR{ProgId}\CLSID со значением по умолчанию, равным идентификатору класса, и ключ HKCR\CLSID{classid}\ProgID со значением по умолчанию, равным ProgId, что означает, что сопоставление равно единице. к одному. Вы просто не сможете иметь более одного идентификатора программы под одним идентификатором класса.

COM-компонент загружается путем вызова CoCreateInstance (), которому передается идентификатор класса - полученный любым возможным способом, включая CLSIDFromProgID(). У компонента нет возможности сказать, как был получен идентификатор класса.

Другие вопросы по тегам