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" />
Другие вопросы по тегам