COM , который широко используется в Windows, зависит от регистрации. Компонент будет предоставлять библиотеки типов, интерфейсы и классы. Каждый из них определяется GUID, чтобы уникально назвать их. Компоненты COM также могут определять ProgID, которые являются своего рода ярлыками для громоздких GUID.
Вся эта информация хранится в специальном кусте реестра на компьютере с именем HKEY_CLASSES_ROOT
. Используйте RegEdit.exe
для просмотра. В частности, вы можете найти библиотеки типов в HKEY_CLASSES_ROOT\TypeLib
, интерфейсы в HKEY_CLASSES_ROOT\Interface
и классы в HKEY_CLASSES_ROOT\CLSID
. Некоторая информация в реестре будет содержать путь к реальной библиотеке DLL с компонентом, позволяющей Windows находить и загружать компонент при запросе.
При установке компонента COM необходимо создать правильную информацию реестра. По соглашению DLL может предоставлять две экспортируемые функции:
При выполнении RegSvr32.exe MyComponent.dll
исполняемый файл RegSvr32.exe
попытается вызвать DllRegisterServer
в MyComponent.dll
. Затем предполагается, что DLL создаст все необходимые записи реестра, чтобы разрешить использование компонента.
Аналогичным образом вы можете использовать RegSvr32.exe /u MyComponent.dll
для отмены регистрации компонента. Это удалит всю информацию, ранее добавленную в реестр.
Windows сильно зависит от COM, и очень важно, чтобы регистрация COM была актуальной. К сожалению, ничто не мешает вам удалить уже зарегистрированный компонент COM. Это оставит в реестре висячие указатели, указывающие на более не существующую DLL. Вы даже не можете отменить его регистрацию, так как он больше не существует.
Другая проблема возникает, когда два разных приложения требуют разные версии одного и того же компонента. Реестр может указывать только на одну из двух версий, что может привести к сбою одного из приложений.
Microsoft создала исправления для этих проблем. Гораздо лучше предоставить установщик для компонента COM, который может восстановить и удалить компонент, если он был удален. Вы также можете создать параллельную установку одного и того же компонента в разных версиях.