Я работаю над проектом, который использует WIX для установки приложения. Одно из требований — удалить старую версию перед установкой текущей. Старая версия не основана на MSI, она создана с помощью SetupApi (который опирается на файлы inf).
Я подумал, что это может быть достигнуто с помощью пользовательского действия, логика выглядит следующим образом:
- найдите «древнюю» версию в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%NAME% и извлеките значение UninstallString, если возможно
- Если значение установлено, запустите пользовательское действие, которое выполнит эту команду, обычно это строка типа RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall
- Это действие необходимо выполнить до установки программы, так как у них есть общие файлы и ключи реестра. Если пользовательское действие будет выполнено в конце установки MSI, это приведет к поломке программы.
Мои вопросы:
- Это рекомендуемый способ удаления старых программ на основе INF?
Есть ли способ бесшумно удалить программы на основе INF? В противном случае пользовательский опыт будет довольно плохим — человек устанавливает программу и вдруг видит окно «удаление программы». Это противоречит здравому смыслу.[решается добавлением ",3" к команде удаления]
Если вам интересно, вот фрагменты кода, которые делают то, что я описал выше:
<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>