exponenta event banner

Регистрация компонента

Самостоятельная регистрация компонентов

Когда продукт MATLAB ® Compiler SDK™ создает компонент, он автоматически создает двоичный файл, называемый библиотекой типов. В качестве последнего шага построения этот файл привязан к результирующей DLL в качестве ресурса.

Компоненты COM компилятора MATLAB SDK регистрируются самостоятельно. Компонент саморегистрации содержит весь необходимый код для добавления или удаления полного описания себя в системный реестр или из него. mwregsvr утилита, распространяемая с помощью среды выполнения MATLAB, регистрирует самостоятельно регистрируемые DLL. Например, для регистрации компонента с именем mycomponent_1_0.dllвведите следующую команду в командной строке DOS:

mwregsvr mycomponent_1_0.dll

Когда mwregsvr завершает процесс регистрации и выводит сообщение об успешном или неуспешном завершении. Аналогично, команда

mwregsvr /u mycomponent_1_0.dll

отменяет регистрацию компонента.

Компонент, установленный на конкретном компьютере, должен быть зарегистрирован в mwregsvr. При перемещении компонента в другую папку на том же компьютере необходимо повторить процесс регистрации. При удалении компонента с определенного компьютера сначала отмените его регистрацию, чтобы в реестре не сохранялась ошибочная информация.

Совет

mwregsvr утилита вызывает процесс, аналогичный regsvr32.exe, за исключением того, что mwregsvr не требует взаимодействия с пользователем на консоли. regsvr32.exe относится к ОС Windows ® и используется для регистрации в реестре динамических библиотек ссылок и элементов управления Microsoft ® ActiveX ®. Эта программа важна для стабильной и безопасной работы компьютера и не должна быть прервана. При вызове необходимо указать полный путь к компонентуmwregsvrили выполнить вызов из папки, в которой находится компонент. Вы можете использовать regsvr32.exe в качестве альтернативы mwregsvr для регистрации библиотеки.

Глобальный уникальный идентификатор

Информация хранится в реестре как разделы с одним или несколькими связанными именованными значениями. Сами клавиши имеют значения в основном двух типов: считываемые строки и GUID. (GUID - аббревиатура глобального уникального идентификатора, 128-битное целое число, гарантированно всегда уникальное.)

Компилятор автоматически генерирует GUID для COM-классов, интерфейсов и библиотек типов, определенных в компоненте во время сборки, и кодирует эти ключи в код саморегистрации компонента.

Интерфейс системного реестра основан на папке. Информация, связанная с COM, хранится под ключом верхнего уровня, называемым HKEY_CLASSES_ROOT. Под HKEY_CLASSES_ROOT - это несколько других ключей, под которыми компилятор записывает информацию о компонентах.

Внимание

Не удалять файл DLL в проекте src между сборками. Это приводит к регенерации GUID в последующей сборке. Чтобы сохранить старую версию DLL, зарегистрируйте ее в системе перед перестроением проекта.

Список ключей и их определений см. в следующей таблице.

КлючОпределение
HKEY_CLASSES_ROOT\CLSID

Информация о классах COM в системе. Каждый компонент создает новый ключ под HKEY_CLASSES_ROOT\CLSID для каждого из классов COM. Созданный ключ имеет значение GUID, которому присвоен класс, и содержит несколько подразделов с информацией о классе.

HKEY_CLASSES_ROOT\Interface

Информация об интерфейсах COM в системе. Каждый компонент создает новый ключ под HKEY_CLASSES_ROOT\Interface для каждого интерфейса, который он определяет. Эта клавиша имеет значение GUID, присвоенное интерфейсу, и содержит подразделы с информацией об интерфейсе.

HKEY_CLASSES_ROOT\TypeLib

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

HKEY_CLASSES_ROOT\<ProgID>, HKEY_CLASSES_ROOT\<VerIndProgID>

Эти два ключа создаются для идентификатора программы компонента и независимого от версии идентификатора программы. Эти ключи построены из строк следующих форм:

component-name.class-name
component-name.class-name version-number

Эти ключи полезны для создания экземпляра класса из имен компонентов и классов вместо GUID.

Управление версиями

Компоненты MATLAB Compiler SDK поддерживают простой механизм управления версиями, позволяющий легко реализовать создание и развертывание нескольких версий одного и того же компонента. Номер версии компонента отображается как часть имени DLL, а также как часть идентификатора, зависящего от версии, в системном реестре.

При создании компонента можно указать номер версии. (Значение по умолчанию - 1,0.) При разработке определенной версии компонента номер версии должен оставаться постоянным. При этом продукт MATLAB Compiler SDK в некоторых случаях повторно использует GUID библиотеки типов, класса и интерфейса для каждой последующей сборки компонента. Это позволяет избежать создания избыточного количества разделов реестра для одного и того же компонента во время нескольких сборок, как это происходит, если для каждой сборки создаются новые GUID.

Когда вводится новый номер версии, MATLAB Compiler SDK генерирует новые GUID классов и интерфейсов, чтобы система распознавала их как отличные от предыдущих версий, даже если имя класса совпадает. Поэтому после развертывания встроенного компонента используйте новый номер версии для любых изменений, внесенных в компонент. Это гарантирует простоту управления двумя версиями после развертывания нового компонента.

MATLAB Compiler SDK реализует правила управления версиями для определенного имени компонента, имени класса и номера версии путем запроса системного реестра для существующего компонента с таким же именем:

  • Если существующий компонент имеет ту же версию, он использует GUID библиотеки типов существующего компонента. Если имя нового класса соответствует предыдущей версии, он повторно использует GUID класса и интерфейса. Если имена классов не совпадают, создается новый GUID для нового класса и интерфейса.

  • Если он находит существующий компонент с другой версией, он использует существующий GUID библиотеки типов и создает новый подраздел для нового номера версии. Он генерирует новые GUID для нового класса и интерфейса.

  • Если он не находит существующий компонент с указанным именем, он создает новые GUID для библиотеки типов, класса и интерфейса компонента.