Повторяющиеся записи в панели управления Add / RemovePrograms при использовании MsiSetExternalUI - PullRequest
1 голос
/ 26 января 2012

Я создал установку для своего продукта, ориентированную на Windows XP и более поздние версии, которая будет установлена ​​с помощью установщика Windows (WI).Полученный MSI-файл содержит код продукта, скажем, PC1 (на самом деле guid) и код обновления UC1 (также guid).Через некоторое время я создал новую настройку для более новой версии моего продукта.Новый MSI-файл содержит новый код продукта PC2 и тот же код обновления UC1 (также называемый крупным обновлением).Моя компания хочет установить MSI-файл с помощью нашего собственного установщика.Для этого мы в основном используем MsiInstallProduct для установки MSI-файла, тогда как весь пользовательский интерфейс находится в нашей собственной программе установки (и мы используем MsiSetExternalUI, чтобы запросить WI для отправки нам уведомлений).Проблема, с которой я столкнулся, заключается в следующем:

  • , если две сборки продукта установлены на одном компьютере с использованием «msiexec / i myapp.msi», тогда будет только одинзапись в «Установка и удаление программ» панели управления «Программы и компоненты».или, другими словами, во время установки новой сборки старая удаляется.

  • , если две сборки установлены на одном компьютере программным способом с использованием MsiInstallProduct, будет два разныхЗаписи в панели управления.

Еще раз, только если я попытаюсь установить его программно (используя MsiOpenPackage + MsiDoAction или MsiInstallProduct), обновление не произойдет, и я получу две записи на панели управления.Я также обнаружил, что если я не установлю обратный вызов внешнего пользовательского интерфейса с помощью MsiSetExternalUI, перед вызовом MsiInstallProduct или MsiDoAction, то обновляющая часть новой установки также будет работать, как ожидается, без дублирующихся записей в CP.

Обратный вызов, который я использую для MsiSetExternalUI, в основном такой же, как и в этой статье MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786(v=vs.85).aspx

Что я могу сделать (или что мне нужно обработать в моемобратный вызов), чтобы избежать дублирования / нескольких записей в панели управления?

Спасибо и всего наилучшего,
Левенте

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Я столкнулся с тем же поведением с моим примером проекта ManagedMsiExec: http://blogs.msdn.com/b/delay/archive/2012/01/09/make-things-as-simple-as-possible-but-not-simpler-managedmsiexec-sample-app-shows-how-to-use-the-windows-installer-api-from-managed-code.aspx

Изменение поведения журнала моего приложения не помогло в моем случае. Но после того, как (независимо) заметив ту же странность "CLIENTUILEVEL = REMOVE = ALL" в журналах, я нашел обходной путь, который должен был явно вызвать MsiSetProperty и установить CLIENTUILEVEL в 0 перед вызовом MsiDoAction.

Мне кажется, что это ошибка самого установщика Windows (неправильная установка CLIENTUILEVEL во время RemoveExistingProducts), но, возможно, происходит что-то еще, чего я не понимаю. Во всяком случае, я имел успех с этим изменением, и, возможно, другие тоже. :)

0 голосов
/ 26 января 2012

По нашим комментариям выше, я выполнил поиск в Google для CLIENTUILEVEL, и первые несколько совпадений указывают мне, что CLIENTUILEVEL со значением NULL является нормальным и что REMOVE = ALL работает. Комментарии указывают на то, что нужно немного пройтись по журналу и выяснить, почему происходит деинсталляция (удаление существующих продуктов). Если бы вы могли написать мне полный файл журнала (chrpai@iswix.com), я мог бы просмотреть его для вас.

Удалить существующее изделие стандартное действие

Ссылка на статью, описывающую, как интерпретировать файлы журнала установщика Windows (см. Комментарии)

RemoveExistingProducts работает, но не удаляет Опции

...