Я работаю над проектом, который использует WIX для установки приложения. Одним из требований является удаление старой версии перед установкой текущего. Старая версия - , а не основанная на MSI, она создана с помощью SetupApi (которая опирается на файлы inf).Пользовательское действие Wix для удаления старой версии, установленной с INF-файлом
Я полагал, что это может быть достигнуто с помощью настраиваемого действия, логика выглядит следующим образом:
- взгляд на "древней" версии в HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \% NAME % и извлечь значение UninstallString если возможный
- Если значение установлено, запустить пользовательское действие, которое будет выполнять эту команду, как правило, это строка, как Rundll32 advpack.dll, LaunchINFSection C: \ PROGRA ~ 1 \ PROGRAM \ file.inf, DefaultUninstall
- Это действие должно быть выполнено перед установкой программы, поскольку у них есть общие файлы и ключи реестра. Если пользовательское действие выполняется в конце установки MSI, он будет ломать программы
Мои вопросы:
- Это рекомендуемый способ удаления старых, программ INF на основе?
-
Есть ли способ отключить программы на основе INF без проблем? В противном случае пользовательский интерфейс будет довольно плохим - человек устанавливает программу, и вдруг они видят окно «Удаление программы». Это счетчик интуитивно понятен.[решена путем добавления», 3" в команду Uninstall]
В случае, если вам интересно, здесь являются фрагменты кода, которые что я описал выше:
<Property Id="ANCIENTVERSION">
<RegistrySearch Id="RegistrySearchAncientVersion" Type="raw"
Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program"
Name="UninstallString" />
</Property>
<CustomAction Id="removeAncientVersion"
Directory="SystemFolder"
<!--ExeCommand="[ANCIENTVERSION]" regular uninstall-->
ExeCommand="[ANCIENTVERSION],3" <!--silent uninstall-->
Execute="immediate"
Return="check"/>
<InstallExecuteSequence>
<Custom Action='removeAncientVersion' After='InstallValidate'>ANCIENTVERSION</Custom>
</InstallExecuteSequence>
Я думаю, что вы можете создать приложение и вызвать функции SetupAPI с соответствующим INF самостоятельно. Таким образом вы можете подавить пользовательский интерфейс прогресса по умолчанию. В качестве альтернативы вы можете показать пользователям диалог, в котором говорится, что вы удалите предыдущую версию приложения. –
Вызов функций SetupAPI напрямую - это вариант, но, к сожалению, я не смог найти никаких подробностей о том, как сделать тихую деинсталляцию с помощью SetupAPI. Существует дискуссия о тихой установке, но я не уверен, что это относится к процессу удаления. Мои эксперименты пока не увенчались успехом. – Alex