Как мне сделать 64-битный MSI? - PullRequest
0 голосов
/ 25 апреля 2018

Я указал:

  • -arch x64 при работе candle.exe.
  • Platform=x64 на Package.
  • ProgramFiles64Folderв качестве идентификатора Directory, куда устанавливаются вещи.

и все же, когда приложение устанавливается, оно переходит к C:\Program Files (x86).

Сгенерировано несколько других wxsна heat.exe.Я попытался добавить -platform x64 и -platform win64 к вызовам на heat.exe, но это не имело значения.

Я прочитал

и я думаю, что яделать все, что там было описано.

Что мне не хватает?

Я придумал минимальный случай, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="Project X" Manufacturer="X LLC" Language="1033" Version="1.0.0.0"
             UpgradeCode="5bf2131c-4068-4cb3-adac-bc9c79ed8ce3">
        <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64"/>
        <Property Id="ApplicationFolderName" Value="Project X"/>
        <Property Id="WixAppFolder" Value="WixPerMachineFolder"/>
        <UI>
            <UIRef Id="WixUI_Advanced"/>
        </UI>
    </Product>
</Wix>

и я компилируюэто выглядит так:

 candle.exe -arch x64 -ext WixUIExtension -ext WixUtilExtension ProjectX.wxs

 light.exe -ext WixUIExtension -ext WixUtilExtension -out ProjectX-1.0.0-beta.3-win64.msi ProjectX.wixobj

Очевидно, что жалобы на пустую таблицу носителей:

> candle.exe -arch x64 -ext WixUIExtension -ext WixUtilExtension ProjectX.wxs
Windows Installer XML Toolset Compiler version 3.11.0.1701
Copyright (c) .NET Foundation and contributors. All rights reserved.

ProjectX.wxs

> light.exe -ext WixUIExtension -ext WixUtilExtension -out ProjectX-1.0.0-beta.3-win64.msi ProjectX.wixobj
Windows Installer XML Toolset Linker version 3.11.0.1701
Copyright (c) .NET Foundation and contributors. All rights reserved.

C:\Users\pupeno\AppData\Local\Temp\h1k0echv\ProjectX-1.0.0-beta.3-win64.msi : warning LGHT1076 : ICE71: The Media table has no entries.

Но программа установки все еще генерируется, и она по-прежнему указывает на C:\Program Files (x86):

enter image description here

Полный .wxs выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Product Id="*" Name="ProjectX" Manufacturer="X Inc" Language="1033"
             Version="$(var.MSIProductVersion)" UpgradeCode="">
        <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64"/>

        <MediaTemplate EmbedCab="yes"/>

        <Icon Id="Icon_ProjectX.ico" SourceFile="src\main\installer\ProjectX.ico"/>

        <WixVariable Id="WixUISupportPerUser" Value="0"/>
        <Property Id="ApplicationFolderName" Value="X Inc\ProjectX"/>
        <Property Id="WixAppFolder" Value="WixPerMachineFolder"/>
        <Property Id="ARPPRODUCTICON" Value="Icon_ProjectX.ico"/>
        <WixVariable Id="WixUILicenseRtf" Value="src\main\installer\eula.rtf"/>
        <WixVariable Id="WixUIBannerBmp" Value="src\main\installer\WixUIBannerBmp.bmp"/>
        <WixVariable Id="WixUIDialogBmp" Value="src\main\installer\WixUIDialogBmp.bmp"/>
        <Property Id="AUTO_CONNECT_TO">
            <RegistrySearch Id="AutoConnectTo" Root="HKLM" Key="Software\X Inc\ProjectX" Name="AutoConnectTo"
                            Type="raw"/>
        </Property>
        <Property Id="RUN_ProjectX_ON_EXIT" Value="true"/>
        <Property Id="INSTALL_SCREENSAVER_ON_EXIT" Value="true"/>
        <Property Id="STAGING_DIR" Value="undefined"/>
        <Property Id="ARCH" Value="undefined"/>

        <UI>
            <UIRef Id="DM_WixUI_Advanced"/>

            <Publish Dialog="DM_ExitDialog" Control="Finish" Event="DoAction" Value="CA_Run_ProjectX">
                RUN_ProjectX_ON_EXIT and <![CDATA[&Ftr_Configurator=3]]> and NOT Installed
            </Publish>

            <Publish Dialog="DM_ExitDialog" Control="Finish" Event="DoAction" Value="CA_Install_Screensaver">
                INSTALL_SCREENSAVER_ON_EXIT and <![CDATA[&Ftr_Screensaver=3]]> and NOT Installed
            </Publish>

            <Dialog Id="DM_ExitDialog" Width="370" Height="270" Title="!(loc.ExitDialog_Title)">
                <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes"
                         Text="!(loc.WixUIFinish)"/>
                <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes"
                         Text="!(loc.WixUICancel)"/>
                <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no"
                         Text="!(loc.ExitDialogBitmap)"/>
                <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes"
                         Text="!(loc.WixUIBack)"/>
                <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0"/>
                <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes"
                         NoPrefix="yes"
                         Text="Thank you for choosing ProjectX. We sincerely hope it satisfies your needs."/>
                <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes"
                         Text="!(loc.ExitDialogTitle)"/>
                <Control Id="RunProjectXCheckBox" Type="CheckBox" X="135" Y="150" Width="220" Height="40" Hidden="yes"
                         Property="RUN_ProjectX_ON_EXIT" CheckBoxValue="1" Text="Run ProjectX Configurator">
                    <Condition Action="show"><![CDATA[&Ftr_Configurator=3]]></Condition>
                </Control>
                <Control Id="InstallScreensaverCheckBox" Type="CheckBox" X="135" Y="190" Width="220" Height="40"
                         Hidden="yes" Property="INSTALL_SCREENSAVER_ON_EXIT" CheckBoxValue="1"
                         Text="Install ProjectX as your screensaver">
                    <Condition Action="show"><![CDATA[&Ftr_Screensaver=3]]></Condition>
                </Control>
            </Dialog>

            <InstallUISequence>
                <Show Dialog="DM_ExitDialog" OnExit="success" Overridable="yes"/>
            </InstallUISequence>

            <AdminUISequence>
                <Show Dialog="DM_ExitDialog" OnExit="success" Overridable="yes"/>
            </AdminUISequence>
        </UI>

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFiles64Folder">
                <Directory Id="APPLICATIONFOLDER">
                    <Directory Id="Dir_jre" Name="jre"/>
                    <Directory Id="Dir_jars" Name="jars"/>
                </Directory>
            </Directory>

            <Directory Id="ProgramMenuFolder">
                <Directory Id="Dir_Menu_ProjectX" Name="ProjectX"/>
            </Directory>

            <Component Id="Cmp_Auto_Connect_to" Win64="yes">
                <RegistryValue Root="HKLM" Key="Software\X Inc\ProjectX" Name="AutoConnectTo" Type="string"
                               Value="[AUTO_CONNECT_TO]"/>
            </Component>

            <Directory Id="SystemFolder"/>
        </Directory>

        <DirectoryRef Id="APPLICATIONFOLDER">
            <Component Id="Cmp_ProjectX_Configurator_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Configurator_exe"
                      Source="$(var.STAGING_DIR)\ProjectX Configurator.exe" KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Configurator" Name="ProjectX Configurator" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_1" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_ProjectX_Displayer_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Displayer_exe" Source="$(var.STAGING_DIR)\ProjectX Displayer.exe"
                      KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Displayer" Name="ProjectX Displayer" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_2" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_ProjectX_Renderer_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Renderer_exe" Source="$(var.STAGING_DIR)\ProjectX Renderer.exe"
                      KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Renderer" Name="ProjectX Renderer" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_3" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_Prosaver_scr" Guid="" Win64="yes">
                <File Id="File_FT_D_Prosaver_scr" Source="$(var.STAGING_DIR)\Prosaver.scr" KeyPath="yes"/>
            </Component>
            <Component Id="Cmp_Icon" Guid="" Win64="yes">
                <File Id="File_Icon" Source="src\main\installer\ProjectX.ico" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <DirectoryRef Id="Dir_Menu_ProjectX">
            <Component Id="Cmp_Install_Screensaver" Guid="" Win64="yes">
                <Shortcut Id="Shrt_Install_Screensaver" Name="Install ProjectX Screensaver"
                          WorkingDirectory="SystemFolder" Icon="Icon_ProjectX.ico"
                          Target="[SystemFolder]rundll32.exe"
                          Arguments="desk.cpl,InstallScreenSaver [#File_FT_D_Prosaver_scr]"/>
                <RemoveFolder Id="Rm_Menu_ProjectX_4" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\X Inc\ProjectX" Name="installed" Type="integer"
                               Value="1" KeyPath="yes"/>
            </Component>
            <Component Id="Cmp_ProjectX_Support" Guid="" Win64="yes">
                <util:InternetShortcut Id="IShrt_ProjectX_Support" Name="ProjectX Support" IconFile="[#File_Icon]"
                                       Target="https://support.ProjectX.tech"/>
                <RemoveFolder Id="Rm_Menu_ProjectX_5" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\X Inc\ProjectX" Name="installed" Type="integer"
                               Value="1" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <CustomAction Id="CA_Run_ProjectX" Directory="APPLICATIONFOLDER" Return="asyncNoWait"
                      ExeCommand="[#File_FT_D_ProjectX_Configurator_exe]"/>
        <CustomAction Id="CA_Install_Screensaver" Directory="SystemFolder" Return="asyncNoWait"
                      ExeCommand="[SystemFolder]rundll32.exe desk.cpl,InstallScreenSaver [#File_FT_D_Prosaver_scr]"/>

        <Feature Id="ProductFeature" Title="ProjectX" Level="1" Display="expand"
                 Description="ProjectX.">
            <ComponentGroupRef Id="ComGrp_JRE"/>
            <ComponentGroupRef Id="ComGrp_JARS"/>
            <ComponentRef Id="Cmp_Auto_Connect_to"/>
            <ComponentRef Id="Cmp_ProjectX_Support"/>
            <ComponentRef Id="Cmp_Icon"/>

            <Feature Id="Ftr_Configurator" Title="Configurator" Level="1"
                     Description="This is the application you use to register a new account as well as configure what websites are displayed, what displayers and renderers have access, etc. You need this in at least one computer to control your account.">
                <ComponentRef Id="Cmp_ProjectX_Configurator_exe"/>
            </Feature>
            <Feature Id="Ftr_Displayer" Title="Displayer" Level="1"
                     Description="This is what displays web sites. You need this (or the screensaver) on all the computers connected to screens that displays web sites.">
                <ComponentRef Id="Cmp_ProjectX_Displayer_exe"/>
            </Feature>
            <Feature Id="Ftr_Renderer" Title="Renderer" Level="1"
                     Description="This accesses your websites and generates the screenshots for the displayers. You need at least one of these although the Configurator can also act as a Renderer.">

                <ComponentRef Id="Cmp_ProjectX_Renderer_exe"/>
            </Feature>
            <Feature Id="Ftr_Screensaver" Title="Screensaver" Level="1"
                     Description="This is what displays web sites as the screensaver. You need this (or the displayer) on all the computers connected to screens that displays web sites.">
                <ComponentRef Id="Cmp_Prosaver_scr"/>
                <ComponentRef Id="Cmp_Install_Screensaver"/>
            </Feature>
        </Feature>
    </Product>
</Wix>

Сводная информация для сгенерированного MSI выглядит следующим образом (GUID изменен):

enter image description here

и каталог указывает на использование ProgramFiles64Folder.Я не могу найти ничего плохого:

enter image description here

%ProgramFiles% все еще указывает на правильное место:

>echo %ProgramFiles%
C:\Program Files

и ятакже произошел сбой на двух разных компьютерах одним и тем же способом (установка на C:\Program Files (x86)).

Если я изменю Directory на ProgramFilesFolder вместо ProgramFiles64Folder, то получу ожидаемыйошибки:

error LGHT0204 : ICE80: This 64BitComponent cmpCBBF8379128F087B61BD92F8113C95D6 uses 32BitDirectory dir451F8F132CB17CBF5649679474428CE4

На всякий случай открываю редактор реестра и удаляю все упоминания C:\Program Files (x86)\X LCC.Это не имело значения: (

Я попытался указать имя для каталога, в качестве эксперимента:

<Directory Id="ProgramFiles64Folder" Name="Program Files">

, и это тоже не имело никакого значения.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Очень срочно отправлено : возможно, попробуйте сначала изменить приведенную ниже запись в таблице Custom Action (используйте Orca для исправления после компиляции ):

изменение :

  • WixSetDefaultPerMachineFolder, 51, WixPerMachineFolder, [ ProgramFilesFolder ], [ApplicationFolderName]

в :

  • WixSetDefaultPerMachineFolder, 51, WixPerMachineFolder, [ ProgramFiles64Folder ], ApplicationFolderName]

У меня нет времени, чтобы должным образом проверить вышеприведенное, но если вы посмотрите на CustomAction table, вы увидите, что WixSetDefaultPerMachineFolder присваивает [ProgramFilesFolder][ApplicationFolderName] WixPerMachineFolder. Тогда у вас есть много чего происходит в таблице ControlEvent с WixAppFolder = "WixPerMachineFolder" и т. Д. Довольно запутанно. Тогда похоже, что WixPerMachineFolder назначен на APPLICATIONFOLDER. Фактическое свойство, используемое в диалоговом окне, выглядит как WIXUI_INSTALLDIR. Не могу отследить все это прямо сейчас - пожалуйста, попробуйте простой взлом выше (просто установите путь к ProgramFiles64Folder ) - он может вернуть пути в отправку. Затем протестируйте все до смерти во всех режимах установки (установка, восстановление, самостоятельное восстановление, изменение, удаление, серьезное обновление, исправление, установка с помощью администратора и т. Д.).

Извините за спешку, удачи.

0 голосов
/ 25 апреля 2018

Как выглядит ваша таблица каталогов?Вы используете ProgramFilesFolder или ProgramFilesFolder64?

Вам также нужно пометить ваши компоненты как 64-битные.Поскольку таблица средств массовой информации жалуется, я предполагаю, что у вас еще нет данных о компонентах.

...