WIX - Создание ярлыка удаления внутри установленной папки
Я использую Wix 3.9 и Wix-edit 0.7.5/Notepad++ для создания установщика MSI для моего приложения. Я хочу создать ярлык удаления внутри установленной папки. Например:
C:\MySoftware\Uninstall.lnk
Я попробовал несколько вещей, но во всех случаях, когда я удаляю программное обеспечение по этой ссылке, папка программы C:\MySoftware
не удаляется Удаление любым другим способом работает как ожидалось.
Сначала я попытался создать его как компонент внутри <Directory>
тег. Выглядит немного хакерски, потому что я должен добавить <CreateFolder>
:
<Directory Id="MYINSTALLDIR" Name="MySoftware">
<!-- my files... -->
<Component Id="ABC" Guid="PUT-GUID-HERE">
<CreateFolder/> <!-- have to add this -->
<Shortcut Id="UninstallProduct" Name="Uninstall MySoftware" Description="Uninstalls MySoftware" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]"/>
</Component>
</Directory>
<Feature Id="DefaultFeature" Title="Main Feature" Level="1">
<!-- some references... -->
<ComponentRef Id="ABC" />
</Feature>
Я тоже пробовал заменить <CreateFolder/>
с <RemoveFolder Id="MYINSTALLDIR" On="uninstall" />
, те же результаты.
Еще одна попытка:
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="StartMenuShortcuts" Guid="*">
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" />
<Shortcut Id="UninstallProduct1" Name="Uninstall MySoftware" Description="Uninstalls MySoftware" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]"/>
<Shortcut Id="UninstallProduct2" Name="Uninstall MySoftware" Description="Uninstalls MySoftware" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]" Directory="MYINSTALLDIR" />
</Component>
</DirectoryRef>
Здесь помимо того же результата я получаю предупреждение при сборке: file.wxs(31) : warning LGHT1076 : ICE57: Component 'StartMenuShortcuts' has both per-user and per-machine data with an HKCU Registry KeyPath.
,
Как создать ярлык, который можно использовать, не влияя на поведение удаления? Я не знаю, если это имеет значение, но мне нужно, чтобы это работало без прав администратора (я использую <Package ... InstallScope="perUser" InstallPrivileges="limited">
).
Я знаю, что могу просто создать файл.lnk и добавить его в проект, но я предпочитаю этого не делать, потому что тогда мне придется беспокоиться об обновлении его GUID в каждом проекте.
1 ответ
Проблема возникает из-за того, что вы не установили рабочий каталог для msiexec, а затем он будет использовать текущий каталог, вызывая ошибку 2911 (не удалось удалить папку).
Добавить ссылку на WindowsFolder
:
<Directory Id="MYINSTALLDIR" Name="MySoftware">
...
<Directory Id="WindowsFolder" Name="WindowsFolder" />
</Directory>
А затем измените свой ярлык, добавив атрибут WorkingDirectory="WindowsFolder"
:
<Shortcut Id="UninstallProduct" Name="Uninstall MySoftware"
Description="Uninstalls MySoftware" Target="[System64Folder]msiexec.exe"
Arguments="/x [ProductCode]" WorkingDirectory="WindowsFolder" />