Installshield 2014 Basic MSI Hide функции динамически не устанавливая функции
Я создал Basic MSI Installer, используя InstallShield 2014 для серверной / клиентской программы, и должен динамически скрывать функции на основе лицензионного ключа базы данных, которая устанавливается до установки нашего приложения-сервера. Я создал условия для функций, которые необходимо скрыть, установив InstallLevel на 0, если они не лицензированы, и на 1, если они лицензированы. Я получаю лицензионный ключ после диалогового окна входа в систему SQL (поскольку установщик не будет знать, какую базу данных искать в противном случае), но условия оцениваются во время действия CostFinalize, которое выполняется до создания диалогов. Поэтому после получения лицензионного ключа и выполнения некоторых других настраиваемых действий для определения доступности каждой функции я вызываю действие CostFinalize перед отображением диалогового окна CustomSetup.
Я получаю правильное поведение для функций, которые должны быть показаны, и вы можете выбрать или отменить выбор указанных функций в диалоговом окне, однако при выполнении установки выбранная функция не устанавливается.... и файл журнала сообщает, что функция не выбрана для установки, даже если пользователь четко ее выбрал. Почему это происходит? Есть ли другой подход к динамическому скрытию объектов (я пробовал функцию FeatureSetData в действии InstallScript, но безрезультатно)?
Кроме того, после того, как я добавил условия к функциям, всякий раз, когда я пытаюсь удалить программу из приложения "Программы и компоненты", я получаю сообщение об ошибке 1606 "Не удается получить доступ к сетевой папке". Это похоже на то, что ключ реестра портится, когда есть условия для функций... Любая помощь будет принята с благодарностью.
2 ответа
Я обнаружил проблему... Если для начала установить для компонентов InstallLevel значение 0, а для условия задано значение, большее нуля, то функция не будет установлена, независимо от того, выбрана ли она. Если вы инвертируете эту логику и начнете с функциями InstallLevel, установленными в 1, и при условии, что уровень установки изменится на 0, он будет скрывать или показывать функцию И она будет установлена правильно. Это также вызвало ошибку 1606, которую я получал при удалении...
Кроме того, если у кого-либо есть установленные компоненты, которые не должны быть установлены, вы можете попробовать отключить проверку зависимостей. По какой-то причине проверка зависимостей.NET, которую выполняет InstallShield, приводит к постоянной установке определенных компонентов, даже если их назначенная функция отключена. Надеюсь, это поможет кому-то в будущем.
CostFinalize также можно запустить в диалоговом окне, чтобы обновить список функций. Вот шаги: В следующей кнопке диалога SetupType создайте новый элемент вверху.
Событие: DoAction
Аргумент: CostFinalize
Состояние: 1=1
В моем случае я скрывал функцию, основанную на предыдущем диалоге, и нуждался в ней для переоценки условий в функции программы. Условие: Уровень:0 GLOBAL_VAR=0 Условие: Уровень:1 GLOBAL_VAR=1