2013-10-24 5 views
2

Я пишу установщик Inno Setup, который можно установить несколько раз и устанавливать сторонние продукты. Для каждой установки требуются сторонние продукты, поэтому при удалении моего приложения я запускаю функцию проверки в записи [UninstallRun], чтобы узнать, есть ли еще какие-либо экземпляры моего приложения по-прежнему в системе. Если это так, то я бы не удалял сторонние продукты (только удаление последнего экземпляра моего приложения удалит эти ...).UninstallRun Проверка выполнения функции во время удаления

Проблема заключается в том, что функция проверки [UninstallRun] выполняется и оценивается во время установки и не деинсталляции (поскольку данные деинсталляции встроены во время установки). Это означает, что если я удалю первый установленный экземпляр моего приложения, он удалит сторонние продукты (потому что время установки первого не было других экземпляров моего приложения).

Есть ли способ сказать Inno Setup выполнить функцию проверки раздела [UninstallRun] во время и только при удалении? Если нет идей, как добиться требуемого поведения?

+0

Я бы назвал это ошибкой, так как нет необходимости проверять функции проверки во время установки. Их записи никогда не исполняются во время установки, поэтому нет необходимости оценивать их проверки. Я думал, что смогу помочь вам, предложив условное выполнение ваших функций, если 'IsUninstaller' возвращает True. Что еще хуже, функция IsUninstaller возвращает False даже из деинсталлятора. У меня нет времени идти глубже, но я чувствую, что здесь что-то не так. (кстати, у меня есть v.5.5.4) – TLama

+0

Кажется, что это по дизайну: http://news.jrsoftware.org/read/article.php?id=99482&group=jrsoftware.innosetup#99482 Нечетный. .. –

+0

Uhm, поэтому все значения проверки оцениваются при создании деинсталлятора. Это очень вводит в заблуждение, и я думаю, что многие люди ожидают условного запуска чего-либо в зависимости от реальной ситуации в определенном состоянии системы при запуске деинсталлятора, а не при установке приложения (и создании деинсталлятора). В этой ситуации я за удаление параметра 'Check' из раздела' [UninstallRun] ', следовательно, это может привести к неожиданному поведению. – TLama

ответ

3

Нет.

Однако вы можете написать [Code], который будет выполняться при деинсталляции. Как правило, что-то вдоль этих линий:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
    if CurUninstallStep = usUninstall then begin 
    if ShouldUninstallComponentX() then begin 
     UninstallComponentX(); 
    end; 
    end; 
end; 

Вам нужно будет заполнить в ComponentX функции себя, конечно, и вы хотите добавить проверку ошибок и т.д., как это необходимо.

Вам все равно нужно позаботиться о том, чтобы делать автоматические удары сторонних продуктов. Если для ваших приложений не существует чего-то уникального в том, как они были установлены (например, имя специального экземпляра в случае сервера базы данных), вы можете по-прежнему непреднамеренно удалить продукт, когда он еще используется каким-либо другим приложением, или он может удалите его, когда он вам еще понадобится.

Если это что-то достаточно большое, чтобы быть «продуктом», то оно должно иметь свою собственную запись в «Программы и функции», и если это так, то лучше всего оставить его пользователю, чтобы решить, когда его удалить либо никогда автоматически не удаляя его самостоятельно, либо попросив пользователя в то время, когда вы считаете его безопасным для удаления (т. е. когда последняя копия ваших приложений удалена), хотят ли они этого или нет.

Меньшие компоненты общей библиотеки обычно используют другой подход; вместо того, чтобы запускать полную программу установки/удаления, вы должны включать библиотеки непосредственно в [Files] и использовать флаг sharedfile для отслеживания, когда они безопасны для удаления. (Это зависит от всех приложений, которые делают то же самое, конечно, но это работает даже для приложений, которые не используют Inno в качестве их установщика.)

В идеале, если продукт предназначен для использования в качестве общего компонента, должен иметь документацию о том, как правильно определить, когда этого не требуют другие приложения.

Смежные вопросы