Пользовательское действие Wix для удаления старой версии, установленной с файлом INF - PullRequest
2 голосов
/ 30 января 2012

Я работаю над проектом, который использует WIX для установки приложения.Одним из требований является удаление старой версии перед установкой текущей.Старая версия не основана на MSI , она создается с помощью SetupApi (которая опирается на файлы inf).

Я полагал, что это может быть достигнуто с помощью специального действия, логика заключается в следующем:

  1. найдите «древнюю» версию в HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \% NAME% и извлеките значение UninstallString если возможно
  2. Если установлено значение, запустите пользовательское действие, которое будет выполнять эту команду, обычно это строка типа RunDll32 advpack.dll, LaunchINFSection C: \ PROGRA ~ 1 \ PROGRAM \ file.inf, DefaultUninstall
  3. Это действие необходимо выполнить перед установкой программы, поскольку они имеют общие файлы и ключи реестра.Если пользовательское действие будет выполнено в конце установки MSI, оно сломает программу

Мои вопросы:

  1. Это рекомендуемый способ удаления старого,Программы на основе INF?
  2. Есть ли способ удалить программы на основе 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>

1 Ответ

1 голос
/ 01 февраля 2012

После некоторых исследований я обнаружил, что для запуска автоматической деинсталляции необходимо добавить «3» в конец командной строки UninstallString.Я проверил это, и оно работает:

Обычное удаление

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall

Тихое удаление

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall,3

Что касается первого вопроса - поскольку механизм удаления является эквивалентом нажатия«Удалить» в «Установка и удаление программ», я считаю, что он не может быть чище / лучше, чем это.

...