2012-01-30 5 views
2

Я работаю над проектом, который использует WIX для установки приложения. Одним из требований является удаление старой версии перед установкой текущего. Старая версия - , а не основанная на MSI, она создана с помощью SetupApi (которая опирается на файлы inf).Пользовательское действие Wix для удаления старой версии, установленной с 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" в команду 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> 
+0

Я думаю, что вы можете создать приложение и вызвать функции SetupAPI с соответствующим INF самостоятельно. Таким образом вы можете подавить пользовательский интерфейс прогресса по умолчанию. В качестве альтернативы вы можете показать пользователям диалог, в котором говорится, что вы удалите предыдущую версию приложения. –

+0

Вызов функций SetupAPI напрямую - это вариант, но, к сожалению, я не смог найти никаких подробностей о том, как сделать тихую деинсталляцию с помощью SetupAPI. Существует дискуссия о тихой установке, но я не уверен, что это относится к процессу удаления. Мои эксперименты пока не увенчались успехом. – Alex

ответ

1

После некоторых исследований я что для того, чтобы запустить тихую деинсталляцию, нужно добавить «, 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 

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

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

  • Нет связанных вопросов^_^