我在这里看到了一些类似的问题,但是没有一个解决方案对我来说非常清楚或有效。
我有一个安装程序(使用WiX创建),可以安装某些文件和文件夹。但是,在运行已安装的应用程序时,会创建一些文件夹并将一些文件复制到其中。卸载时不会删除这些文件和文件夹。
编辑到目前为止显示代码:
此INSTALLDIR属性:
<Property Id="INSTALLDIR">
<RegistrySearch Id='Registry' Type='raw' Root='HKLM' Key='Software\$(var.Manufacturer)\$(var.ProductName)' Name='Location' />
</Property>
此组件应在注册表中设置安装位置:
<Component Id="Registry" Guid="*">
<RegistryKey Root="HKMU" Key="Software\$(var.Manufacturer)\$(var.ProductName)">
<RegistryValue Name="Location"
Type="string"
Value="[INSTALLDIR]"
Action="write"
KeyPath="yes" />
</RegistryKey>
<util:RemoveFolderEx On="uninstall" Property="INSTALLDIR" />
</Component>
这确实会在注册表中创建一个包含安装位置的记录,但是我不确定如何调整此代码以记录“公共”&#39;目录并删除它 - 我不知道util:RemoveFolderEx应该去哪里(在哪个组件内)
答案 0 :(得分:1)
我见过的最清楚的教程是this one(除了确实有明显的错误)。
替换此块:
<!--
RemoveFolderEx requires that we "remember" the path for uninstall.
Read the path value and set the APPLICATIONFOLDER property with the value.
-->
<Property Id="APPLICATIONFOLDER">
<RegistrySearch Key="SOFTWARE\$(var.Manufacturer)\$(var.SkuName)" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" />
</Property>
这一个:
<!--
RemoveFolderEx requires that we "remember" the path for uninstall.
Read the path value and set the FOLDERTOREMOVE property with the value.
-->
<Property Id="FOLDERTOREMOVE">
<RegistrySearch Key="SOFTWARE\$(var.Manufacturer)\$(var.SkuName)" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" />
</Property>
和这个块:
<util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" />
这一个:
<util:RemoveFolderEx On="uninstall" Property="FOLDERTOREMOVE" />
你应该有一个工作测试。
使用两个不同属性的原因是here和here(与其他地方一起)。
如果您可以从Windows安装程序将为您保留的安装期间设置的其他值(例如ARPINSTALLLOCATION)派生路径,那么您可以调整上述实现以获得所需而无需创建你自己的注册表项。
答案 1 :(得分:1)
以B. Murri的回答为基础:
示例:您的应用程序在'installdir / public'中安装新文件或文件夹。这些文件未被删除,因为安装程序未添加这些文件。
首先,您需要创建一个注册表值,该值将存储您的公共目录的安装位置。这是在用户更改安装目录的情况下。
<!-- Note that the RegistryValue Value is being set to the 'public' directory ID -->
<DirectoryRef Id='INSTALLDIR'>
<Component Id="RemovePublicDir" Guid="your-guid-here">
<RegistryKey Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)">
<RegistryValue Name="Location"
Type="string"
Value="[PUBLIC]"
Action="write"
KeyPath="yes" />
</RegistryKey>
<CreateFolder Directory="PUBLIC"/>
<util:RemoveFolderEx Property="FINDPUBLICDIR" On="uninstall"/>
<RemoveFolder Id="PUBLIC" On="uninstall"/>
</Component>
</DirectoryRef>
您现在需要添加一个属性,以便稍后搜索此注册表值。确保上面的Root值与下面的值匹配:
<Property Id="FINDPUBLICDIR">
<RegistrySearch Id='Registry' Type='raw' Root='HKCU' Key='Software\$(var.Manufacturer)\$(var.ProductName)' Name='Location' />
</Property>
将您的制造商名称和产品名称添加到变量中,如下所示:
<?define Manufacturer = "My Company"?>
<?define ProductName = "Test Application"?>
现在请务必在功能标记中调用此组件:
<Feature Id="FeatureId">
<ComponentRef Id="RemovePublicDir" />
</Feature>