Постоянство данных для установки MSI

Установка MSI вызовет мои (собственные /C++) функции пользовательских действий. Поскольку библиотека DLL недавно загружена, и процесс MSIEXEC.EXE запускается отдельно для каждой функции (вызываемые действия, как указано в скрипте MSI/WiX), я не могу использовать какие-либо глобальные данные в программе C/C++.

Как (или Где) я могу хранить некоторую информацию о продолжающейся установке? Я не могу использовать именованные объекты (например, совместно используемую память), поскольку "процесс", который запускает DLL для вызова функции "action", завершится, и ОС не сохранит именованный объект.

Я могу использовать внешний файл для хранения, но тогда как я узнаю (в функции DLL):

  • Когда удалять внешний файл.
  • Когда обнаруживается, что этот вызов функции является первым вызовом (вызов действия / функции Before="LaunchConditions" может помочь, не очень уверен).

Если я не могу удалить файл, я не могу знать, является ли "информация" текущей или устаревшей (то есть принадлежащая ранее неудачному / успешному запуску MSI).

"Временные таблицы MSI" я слышал, но не уверен, как их использовать.

1 ответ

Решение

Сохранить настройки: если честно, я немного запутался в том, что делают ваши пользовательские действия. Тем не менее, похоже, что они сохраняют настройки из более старого приложения и версии установки и возвращают их на место, если MSI не удается правильно установить?

Предложение по миграции (пожалуйста, серьезно рассмотрите этот вариант): не могли бы вы установить новый пакет MSI и удалить все ярлыки и доступ к старому приложению, оставив его вместо этого установленным? Ваша новая версия приложения устанавливается по новому пути и в новый куст реестра, а затем вы переносите все настройки при первом запуске нового приложения, а затем запускаете удаление старого приложения - каким-либо образом - или просто оставляете его установленным, если это приемлемо.? Есть ли COM-серверы в вашей старой установке? Другие вещи, которые имеют глобальную регистрацию?

Воздержание от пользовательских действий: Выше приведено лишь предложение избегать пользовательских действий. Есть много причин, чтобы избежать пользовательских действий (пропаганда против пользовательских действий). Если вы переносите настройки при запуске приложения, вы избегаете всех sequencing, conditioning, impersonation проблемы наряду с technical issues вы уже сталкивались (есть еще много) с использованием пользовательских действий. И главное, вы в знакомом debugging context (код запуска приложения), в отличие от незнакомого мира настроек и их плохой отладки.


Сохранение настроек и данных. Что касается сохранения данных и настроек в работающем экземпляре MSI, встроенный механизм в основном устанавливает свойства с помощью Session.Property (COM / VBScript) или же MsiSetProperty (Win32) звонки. Это позволяет сохранить строки внутри MSI Session объект. Сортировка глобальных данных.

Обратите внимание, что свойства могут быть установлены только в непосредственном режиме (настраиваемые действия, которые не изменяют систему), и отправка данных в настраиваемые действия отложенного режима (которые могут вносить изменения в систему) довольно сложна, сосредоточившись вокруг CustomActionData концепция ( подробнее об отложенном режиме и CustomActionData).

По сути, вы отправляете строку в пользовательское действие отложенного режима с помощью пользовательского действия SetProperty в непосредственном режиме. Как правило, это строка, разделенная по домам, которую вы создаете в непосредственном режиме и разбиваете на информационные фрагменты при получении в отложенном режиме. Вы можете попробовать использовать JSON-строки и тому подобное, чтобы сделать передачу более простой и надежной, выполняя сериализацию и десериализацию объектов через строки JSON.

Альтернативы?: Этот подход с использованием набора свойств задействован. Некоторые люди пишут в и из реестра во время установки или во временный файл (во временной папке), а затем очищают во время фазы фиксации MSI, но мне не нравится этот подход по нескольким причинам. С одной стороны, принятие пользовательских действий может не выполняться на основе политик на целевых системах ( когда откат отключен, сценарий принятия не создается - см. Раздел " Выполнение выполнения "), и это не лучший метод. Добавление временных строк - интересный вариант, на который я никогда не тратил много времени. Я сомневаюсь, что вы могли бы легко использовать это для достижения того, что вам нужно, хотя я не знаю, что вам нужно в деталях. Я не использовал это должным образом. Быстрый образец. Этот пример RemoveFile из WiX может быть лучше.

Другие вопросы по тегам