Wix installer (3.0) - как мне написать в реестр после успешной или неудачной установки? - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть приложение, которое будет установлено другой программой (в основном, это обертка, которая устанавливает несколько приложений и сообщает о том, что они прошли / не пройдены для каждого). Требование команды разработчиков оболочки заключается в том, что мое приложение должно написать либо Success , либо Fail в определенный раздел реестра после завершения установки.

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

Основываясь на чтении примеров, просмотре справки Wix и поиске похожих проблем, я почти уверен, что мне нужно использовать пользовательское действие, что-то вроде

<Custom Action="SetInstallationStatusFail" After="InstallFinalize">NOT Installed</Custom>

Сейчас я застрял в том, что не знаю, какой код мне нужно написать для SetInstallationStatusFail , чтобы обновить раздел реестра. Я также не уверен, что родительский элемент, чтобы положить его под. Я думаю, что это должно быть что-то простое, как это

<RegistryValue Action="write" Root="HKLM" Key="SOFTWARE\$(var.RegistryCompanyName)\$(var.RegistryProductName)\InstallStatus" Name="install" Type="string" Value="Fail" />

Если вы считаете, что я пытаюсь сделать что-то недопустимое, или если вы знаете лучшее решение для записи в реестр после установки, пожалуйста, дайте мне знать. Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011

Это плохое требование, потому что значение реестра было бы "осиротевшим", и нечего его очищать. MSI уже предоставляет способ определения успеха или неудачи: код возврата. См. «Коды ошибок» в MSI SDK для получения списка.

MSI не предоставляет способ записи в реестр HKLM после сбоя, ни с помощью собственных, ни с помощью пользовательских действий. (Существуют действия, которые могут быть вызваны при ошибке, но у них нет прав на запись в HKLM.)

1 голос
/ 21 апреля 2011

Поговорите с ребятами-обёртками и посмотрите, готовы ли они рассмотреть другие варианты - даже если они не могут принять коды возврата и хотят проверить где-то еще, есть другие способы сделать это с помощью API установщика Windows.

Например, вот действительно простой VBScript для циклического просмотра установленных на данный момент продуктов, чтобы проверить, установлено ли приложение по имени.

productName = "My Application"

Set installer = Wscript.CreateObject("WindowsInstaller.Installer")

For Each productCode In installer.Products
    If LCase(installer.ProductInfo(productCode, "ProductName")) = LCase(productName) Then Exit For
Next

If IsEmpty(productCode) Then 
    Wscript.Echo "Couldn't find " & productName
Else
    Wscript.Echo "Found " & productName
End If
0 голосов
/ 03 мая 2011

Вот мысль. Вы можете записать значение реестра в обоих случаях в случае успеха или неудачи. Напишите пользовательское действие для записи значения успеха. Запишите и запланируйте пользовательское действие отката для записи ошибочного значения. Если установка не удалась, она будет откатана, а пользовательское действие отката приведет к ошибке записи. Если это удается, вы записываете значение success в пользовательском действии с условием, что оно не установлено.

В любом случае эти значения реестра могут быть удалены во время удаления. Это не может быть элегантным решением, но если это ваше требование, то вы можете выполнить его.

Возможно, Боб Арнсон может прокомментировать это решение.

0 голосов
/ 21 апреля 2011

Другой вариант - проверить, существует ли значение в реестре.

Ваш установщик записывает значение в реестр, значение может быть Успех .Если значение существует в реестре, то установка прошла успешно;если это не так, то установка не удалась.

...