Лучший способ использовать regsvr32
для регистрации COM-интерфейса во время установки - нет. (Оскал)
Вызов regsvr32
и другие формы «самостоятельной регистрации» во время установки с использованием установщика Windows - это плохая практика. COM-интерфейсы часто используются несколькими продуктами. Если пакет A регистрирует интерфейс COM IFoo
, то пакет B (повторно) регистрирует тот же интерфейс, а затем, если какой-либо пакет удаляется и отменяет регистрацию IFoo
, он ломает оставшийся пакет.
Предпочтительный метод - извлечь информацию об интерфейсе COM и встроить ее в записи таблицы реестра в пакете .msi
. MSI распознает совпадающие записи реестра COM и управляет их количеством ссылок, а не дублирует их. 2-я..N-ая запись просто увеличивает счетчик ссылок, каждая деинсталляция просто уменьшает его, пока последняя деинсталляция не уменьшит ref-count до нуля и записи реестра фактически не будут удалены.
В WiX инструмент heat используется для «сбора» COM-интерфейсов (среди прочих данных) в исходные фрагменты WiX, содержащие необходимые записи реестра. Installshield имеет флаг «COM extract at build», который делает то же самое для проектов MSI и Installscript-MSI. Другие наборы инструментов установщика Windows имеют аналогичные возможности.
Примечание. Установщик Windows (MSI) - это базовый API управления установкой, который является частью самой Windows. Вам нужны дополнительные инструменты для генерации .msi
пакетов, которые используют этот API.
Windows Installer XML (WiX) - это схема XML для описания пакетов установки на основе MSI вместе с инструментами для создания фактического пакета .msi
из документов в этой схеме. Installshield - это еще один инструмент, который может генерировать пакеты .msi
.
Это те два, которые я использовал. Есть и другие инструменты, такие как InstallAware и Advanced Installer. Я не могу говорить с их способностями, никогда не использовал их сам. Visual Studio также имеет плагин для генерации инсталляционных пакетов, но, по моему опыту, он плохо масштабируется для продуктов промышленного уровня.