Я новичок в программировании для Windows, но мне нужно создать сложный установщик MSI, который устанавливает плагин с помощью набора инструментов WiX. Установщик должен обнаруживать при запуске все установленные версии определенного программного обеспечения и их подключаемые модули через API реестра Windows. После этого все они должны отображаться на отдельной странице (диалоге) с соответствующими флажками. Пользователь должен выбрать, в какие версии он хочет установить плагин.
Я создал настраиваемое действие (на C ++ и поместило его в DLL, которая находится в базе данных MSI), которое взаимодействует с API реестра, затем перебирает результаты и добавляет временные записи в таблицы базы данных:
- добавляет свойства пути для сохранения путей к плагинам;
- добавляет записи в таблицу CheckBox;
- добавляет свойства для удержания их состояний;
- добавляет для них условия, затем проверяет состояние их свойств и включает / отключает их;
- добавляет события для сброса свойств пути в соответствии со свойствами состояния.
Запускается после AppSearch
<InstallUISequence>
<Custom Action="PopulateVersions" After="AppSearch">Not Installed</Custom>
</InstallUISequence>
Затем нажатие кнопки «Далее» (я знаю, что это неподходящее место для таких вещей) выполняет настраиваемое действие, которое отфильтровывает активные пути свойств, берет первый из них и выполняет действие SetTargetPath (оно отлично работает). Для остальных действие вставляет соответствующие временные записи в:
- таблица DuplicateFile, где DestFolder - имя свойства;
- таблица Component, копирующая все значения полей из исходного компонента, устанавливающая значение поля Component_Parent на оригинальное;
- Таблица Справочника. Одна запись для каждого свойства пути, Direcory_Parent - TARGETDIR;
Он установил плагин только для первого пути к свойству (который был передан в действие SetTargetPath).
Хорошо ... Я добавил несколько элементов CopyFile, которые относятся к моим настраиваемым свойствам (я объявил несколько свойств, чтобы предотвратить ошибку сборки MSI из-за неизвестных свойств) в разметку WiX только для тестирования:
<Property Id="PathProperty0" Value="{}"/>
<Property Id="PathProperty1" Value="{}"/>
<Property Id="PathProperty2" Value="{}"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="INSTALLLOCATION" Name="MyPluginDir">
<Component Id="PluginExt" Guid="C112184A-307C-5E15-994F-0DFDA9DD427E">
<File Id="MyPlugin" Name="MyPlugin.dll" Source="MyPlugin.dll" Vital="yes" />
<CopyFile Id="MyPlugin_Copy1" FileId="MyPlugin" DestinationProperty="PathProperty1"/>
<CopyFile Id="MyPlugin_Copy2" FileId="MyPlugin" DestinationProperty="PathProperty2"/>
</Component>
</Directory>
</Directory>
</Directory>
Теперь ProgressDialog сообщает, что "{}" - недопустимый путь, но все свойства были установлены на допустимые пути (я проверил это при отладке)! Похоже, он забывает или игнорирует все временные изменения базы данных / изменения свойств после отображения запроса UAC с повышением прав, который запрашивает доступ к тому же файлу MSI. Запрос появляется после нажатия кнопки «Установить» (со значком щита) . Вероятно, он снова читает базу данных и не находит никаких изменений, поскольку они были в памяти или кеше, я не знаю.
Что я делаю не так или как правильно сделать этот установщик? ИМХО моя реализация слишком сложна. Мне нужна твоя помощь.