Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.242.141] |
|
Сообщ.
#1
,
|
|
|
Нужен совет, сама я чего-то недопонимаю. Ситуация: есть Программа А и Программа Б, Б ставится только поверх А, но при этом она необязательна, поэтому для них отдельные инсталляшки. Я хочу сделать, чтобы при удалении А, автоматически удалялась Б. Сначала проверяю наличие установки Б в системе, потом вызываю custom action с условием REMOVE="ALL" и Б_ЕСТЬ="YES", в котором пытаюсь удалить Б - "msiexec.exe /x{GUID_B} /qn". Однако, программа не удаляется, в логах этот CA - skipped. Как заставить сработать удаление?
|
Сообщ.
#2
,
|
|
|
Я бы сказал, что у тебя неправильно выставлено условие Посмотри в логах, действительно ли REMOVE="ALL" и Б_ЕСТЬ="YES"
А вообще твой метод неочень хорош Дело в том, что в msi нельзя запустить две deferred фазы, следовательно кастом экшен должен быть immediate, а это приведет к тому, что инсталлер будет 2 раза запрашивать повышенные права |
Сообщ.
#3
,
|
|
|
Да, я уже столкнулась с тем, что он просил второй раз права.
В результате я сделала так. По нажатию кнопки "Удалить" в последнем диалоге вызывается CA, который проверяет наличие программы Б и удаляет ее, т.е. все это происходит до InstallInitialize основного инсталлятора, при попытке ставить удаление Б после него была ошибка "Уже выполняется установка другого продукта. Повторите попытку позднее". При такой схеме второй раз права он не просит, однако на время задумывается на последнем диалоге. Не уверена, что это самое лучшее решение. Fester, а какой метод лучше применять в таких ситуациях? |
Сообщ.
#4
,
|
|
|
Цитата Spica @ какой метод лучше применять в таких ситуациях? вариантов 3 1) испльзовать bootstrapper 2) синхронизироваться через мутексы - запускается удаление А - делается deferred кастом экшен, который запускается перед InstallFinalize. Задачи: установить мутекс1 и запустить удаление Б - делается immediate кастом экшен (FreeMutex) в А (располагается после InstallFinalize). Задача - освободить мутекс1 и дождаться установки мутекс2. - делается immediate кастом экшен в А (располагается после FreeMutex). Задача - ждать освободнения мутекс2. - immediate кастом экшен в Б (где-то перед InstallInitialize). Задача - ждать освободнения мутекс1 и установить мутекс2. - immediate кастом экшен в Б (где-то после InstallFinalize). Задача - освободить мутекс2. удаление Б проводить в silent mode 3) Windows Installer 4.5 умеет работать с nested installation, так что можно порыться в этом направлении. но тут тоже без кастом экшенов не получится. Самые простой способ - bootstrapper 2-й вариант теоретически должен работать сам не пробовал 3-й вариант тоже не пробовал, но по идее должно работать. это пожалуй самый сложный вариант (придется перелопатить MSDN) + нужно будет устанавливать Windows Installer 4.5 в качестве пререквизита (опять же должен быть bootstrapper) |