我正在努力与Wix安装程序。在安装过程中,INSTALLDIR被覆盖到自定义文件夹(而不是在Program Files中)。当我卸载时,无论我做什么,INSTALLDIR和TARGETDIR都设置为E:\。
我该如何解决这个问题?以下是相关摘要:
<Property Id="ARPINSTALLLOCATION">
<RegistrySearch Id="GetINSTALLDIRFromRegistry" Root="HKLM"
Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="raw" />
</Property>
<SetDirectory Id="TARGETDIR" Value="[ARPINSTALLLOCATION]">Installed</SetDirectory>
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CreateFolders" Sequence="execute">NOT Installed</SetProperty>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLDIR" Name="WinApp">
</Directory>
</Directory>
</Fragment>
提前致谢。我正在使用Wix Tools 3.10。
更新1
以下是我的调查结果(现在。请更正我,因为我还是Wix的新手)
因此,如果您将目录结构设置为:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLDIR">
<Directory Id="TEST" Name="WinApp" />
</Directory>
</Directory>
</Fragment>
您必须通过属性分配或自定义操作设置INSTALLDIR目录。例如:
<Property Id="INSTALLDIR"><![CDATA[C:\mydir1\mydir1]]></Property>
如果通过对话框动态设置INSTALLDIR,则必须从注册表或文件(安装期间存储它的位置)中读取它。
更新2
略有改进的版本
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" Sequence="execute" After="InstallFiles" />
<Property Id="INSTALLDIR" Secure="yes">
<RegistrySearch Id="Locate_EXISTINGINSTALLDIR" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="directory" />
</Property>
<CustomAction Id="SetTARGETDIR"
Directory="TARGETDIR"
Value="[INSTALLDIR]"
Return="check" />
<InstallExecuteSequence>
<!--this action launches a window to allow the user to choose the folder. don't want
to use standard MSI/Wix dialogs as the functionality is limited
-->
<Custom Action='SelectFolderCustomAction' Before='CreateFolders'>NOT Installed</Custom>
<!--<Custom Action='RegistrationInfoCustomAction' Before='InstallFinalize'>NOT Installed</Custom>-->
<!--<Custom Action='UninstallCustomAction' Before='RemoveFiles'>Installed AND REMOVE = "ALL"</Custom>-->
<Custom Action="SetTARGETDIR" Before="RemoveFiles">Installed AND REMOVE = "ALL"</Custom>
</InstallExecuteSequence>
答案 0 :(得分:2)
我不明白你上面要做的是什么。为什么要从注册表中读取安装位置?
这是我安装到“D:\ Program Files”文件夹时所做的。
<Property Id="ROOTDRIVE"><![CDATA[D:\]]></Property>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles" Name="Program Files">
答案 1 :(得分:0)
删除SetDirectory
元素,它已过时。安装产品后, Windows Installer会自动将目录属性设置为实际安装目录的路径。
RegistrySearch
的{{1}}看起来也很奇怪。通常,此属性应仅在首次安装期间设置,您已使用ARPINSTALLLOCATION
元素执行此操作。
所以以下内容应该足够了:
SetProperty