我正在使用自定义对话框构建MSI,但我没有自定义欢迎对话框。我有一个有效的产品ID和升级ID,而AllowSameVersionUpgrades也没有。以下是UI代码,我的Product.wxs中引用了该代码。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<WixVariable Id="WixUIBannerBmp" Value="Images\Banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="Images\dialog.bmp" />
<UI Id="CustomUI">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<!--Standard Dialog References needed to compile-Starts-->
<DialogRef Id="WelcomeDlg" />
<DialogRef Id="DiskCostDlg" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="UserExit" />
<!--Standard Dialog References needed to compile-Ends-->
<DialogRef Id="CustLicenseAgmtDlg"/>
<DialogRef Id="InstallDlg"/>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="CustLicenseAgmtDlg">NOT Installed AND NOT PATCH</Publish>
<Publish Dialog="CustLicenseAgmtDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="CustLicenseAgmtDlg" Control="Next" Event="NewDialog" Value="BrowsePathDlg">1</Publish>
<Publish Dialog="BrowsePathDlg" Control="Back" Event="NewDialog" Value="CustLicenseAgmtDlg">1</Publish>
<Publish Dialog="BrowsePathDlg" Control="Next" Event="NewDialog" Value="InstallDlg">1</Publish>
<Publish Dialog="InstallDlg" Control="Back" Event="NewDialog" Value="BrowsePathDlg">1</Publish>
</UI>
<InstallUISequence>
<Show Dialog="WelcomeDlg" Before="ProgressDlg">NOT Installed OR PATCH</Show>
</InstallUISequence>
<UIRef Id="WixUI_Common" />
<UIRef Id="WixUI_ErrorProgressText" />
</Fragment>
</Wix>
第一次,安装程序运行正常并安装文件。但是从下一次开始,它就没有显示错误,它已经安装好了。而是它在闪光灯中从第一个屏幕跳到最后一个屏幕。但是,如果我在VS中重建此MSI项目并运行新安装程序,则会显示错误。我不确定我做错了什么。有人可以帮忙吗?
答案 0 :(得分:0)
您正在混淆正在安装的内容&#39;装置
您明确要求显示您的WelcomeDlg NOT Installed OR PATCH
,这意味着您的产品已安装后,您永远不会展示您的WelcomeDlg。 &#34;安装&#34;在这种情况下,是此产品已安装时设置的特殊属性。
混淆可能是&#34;这个产品&#34;。这意味着具有相同产品GUID的安装程序已存在于系统中。
我猜你的安装程序中有<Product Id="*">
。重建时,您将获得另一个产品GUID,因此当您运行所构建的新安装程序时,即使它具有与旧安装程序完全相同的所有内容,产品GUID也会有所不同。在Windows&#39;眼睛,这是一个完全独立的产品,所以它不会设置&#34;已安装&#34;属性,您将显示您的欢迎对话框。由于您,我认为,您的产品安装时会设置一些属性,它会显示您已经安装的&#34;已安装的&#34;错误。
如果您将显示条件设置为1
,我认为您会得到您期望的行为。
<InstallUISequence>
<Show Dialog="WelcomeDlg" Before="ProgressDlg">1 AND NOT REMOVE~="ALL"</Show>
</InstallUISequence>
我添加了AND NOT REMOVE~="ALL"
因为我不太确定如果您尝试卸载没有它的产品会发生什么。我认为卸载时会显示欢迎对话框吗?在对话条件下,您必须使用和不使用额外的AND来测试它。
<小时/>
我认为您应该重新评估这是否实际上是您想要做的,因为这似乎是在您的安装程序中实现的一种奇怪的行为。它应该已经知道它默认安装。
答案 1 :(得分:0)
有4个元素可以控制此行为
如果您希望安装程序在安装了它的版本时正确阻止(并在安装新版本时自行替换),那么您需要这些值看起来像这样
产品版本=相应设置的Major.Minor.Revision版本号
<Product Id="*" UpgradeCode="guid" Version="1.0.1"
存在MajorUpgrade元素
<MajorUpgrade AllowSameVersionUpgrades="no" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
设置这些元素后,一旦安装了1.0.1,将来尝试安装(即使您重建了安装程序)也会失败。
将版本号转换为1.0.2,重建安装程序并运行安装将导致卸载1.0.1,并安装1.0.2。
请注意,您可以设置&#34; AllowSameVersionUpgrades&#34;到&#34;是&#34;允许相同的版本重新安装&#34;在现有的