Вопрос

Наш продукт содержит встроенный COM-сервер VC ++ ATL с двумя открытыми COM-классами - ClassA и ClassB. Этот COM-сервер добавлен в установочный пакет Install Shield 2008 и «COM Extract at Build». свойство установлено для компонента.

ClassA и ClassB предоставляются компонентом совершенно одинаковым образом - для каждого из них есть файл .rgs, оба файла .rgs компилируются в ресурсы компонента, и для обоих из них вызывается CAtlModule :: UpdateRegistryFromResourceS ().

Однако, когда мы запускаем regsvr32 на COM-сервере, оба класса правильно отображаются в реестре, но когда мы запускаем установку пакета, Install Shield открывает только один из них.

Как Install Shield определяет, какие изменения необходимо внести в реестр? Что мы должны проверить, чтобы определить источник проблемы?

Это было полезно?

Решение

Я подозреваю, что они используют RegOverridePredefKey (по крайней мере, MSDN намекает на это): http://msdn.microsoft.com/en-us /library/ms724901(VS.85).aspx

После того, как целевые ключи были переопределены в каком-то приватном месте, InstallShield может проанализировать структуру реестра и сгенерировать для нее скрипт.

Это все предположение, хотя я не знаю, что на самом деле делает InstallShield, но я думаю, что начну с RegMon во время выполнения сборки InstallShield, чтобы посмотреть, смогу ли я определить, куда идут регистрации, а затем попытаться определить, что он делает неправильно.

Другие советы

Если вы хотите получить подробное объяснение (или столько, сколько ему позволено дать), вы захотите перейти на форум сообщества InstallShield и опубликовать вопрос для сотрудника InstallShield MichalU. Если вы хотите узнать, как все это работает, вы можете взглянуть на исходный код WiX, поскольку у Heat есть возможность извлекать com-информацию.

Если извлечение COM при сборке создает проблемы, вы можете отключить его и вставить данные COM статически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top