在Wow64节点中未创建Wix安装程序注册表项

问题描述:

我有一台64位机器,我需要安装Windows服务。该服务是使用Apache procrun创建的,因此我需要创建某些注册表项。这些应该像我预期的那样进入wow64节点,但是它们是在HKLM/SOFTWARE/Wow64节点的HKLM/SOFTWARES instread中创建的。以下是我的Product.wxs文件。在Wow64节点中未创建Wix安装程序注册表项

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Id="*" Name="DummyInstaller" Language="1033" Version="1.0.0.0" Manufacturer="Bryan" UpgradeCode="94D1BC64-7CC1-45DA-BD5F-8ED40980E75C"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

    <Property Id="JAVA_CURRENT_VERSION64"> 
     <RegistrySearch Id="JRE_CURRENT_VERSION_REGSEARCH64" Root="HKLM" Key="SOFTWARE\JavaSoft\Java Runtime Environment" Name="CurrentVersion" Type="raw" Win64="yes" /> 
    </Property> 

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

    <Feature Id="ProductFeature" Title="DummyInstaller" Level="1" > 
     <!--<ComponentGroupRef Id="NewFilesGroup" />--> 
     <ComponentRef Id="REGISTRY_A" /> 
     <ComponentRef Id="PROCRUN.EXE"/> 
    </Feature> 
    </Product> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFiles64Folder"> 
     <Directory Id="DummyDir" Name="DummyInstaller"> 
      <!--<Directory Id="MyProgramDir" Name="MosquittoNew" />--> 
      <Directory Id="SERVERDIR" Name="UpdaterService" > 
      <Component Id="REGISTRY_A" DiskId="1" Guid="*" Win64="yes"> 
       <RegistryKey Root="HKLM" Key="SOFTWARE\Apache Software Foundation\Procrun 2.0\UpdaterService\Parameters\Java" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Classpath" Value="E:\Service\Update_Service-1.0.jar" KeyPath="yes" /> 
       <RegistryValue Type="string" Name="Jvm"  Value="C:\Program Files\Java\jdk1.8.0_25\jre\bin\server\jvm.dll" /> 
       <RegistryValue Type="multiString" Action="append" Name="Options"> 
        <MultiStringValue Type="multiString" Name="Options" Action="append">-Duser.language=en</MultiStringValue> 
        <MultiStringValue Type="multiString" Name="Options" Action="append">-Duser.region=US</MultiStringValue> 
       </RegistryValue> 
       <RegistryValue Type="integer" Name="JvmMs" Value="256" /> 
       <RegistryValue Type="integer" Name="JvmMx" Value="1024" /> 
       <RegistryValue Type="integer" Name="JvmSs" Value="4000" /> 
       </RegistryKey> 
       <RegistryKey Root="HKLM" Key="SOFTWARE\Apache Software Foundation\Procrun 2.0\UpdaterService\Parameters\Log" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Path" Value="c:\logs" /> 
       <RegistryValue Type="string" Name="Level" Value="Error" /> 
       <RegistryValue Type="string" Name="Prefix" Value="UpdaterService" /> 
       <RegistryValue Type="string" Name="StdError" Value="c:\logs\stderr.txt" /> 
       <RegistryValue Type="string" Name="StdOutput" Value="c:\logs\stdout.txt" /> 
       </RegistryKey> 
       <RegistryKey Root="HKLM" Key="SOFTWARE\Apache Software Foundation\Procrun 2.0\UpdaterService\Parameters\Start" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Mode" Value="jvm" /> 
       <RegistryValue Type="string" Name="Class" Value="com.kohls.kube.services.updater.UpdaterServiceMain" /> 
       <RegistryValue Type="string" Name="Params" Value="start" /> 
       </RegistryKey> 
       <RegistryKey Root="HKLM" Key="SOFTWARE\Apache Software Foundation\Procrun 2.0\UpdaterService\Parameters\Stop" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Mode" Value="jvm" /> 
       <RegistryValue Type="string" Name="Class" Value="com.kohls.kube.services.updater.UpdaterServiceMain" /> 
       <RegistryValue Type="string" Name="Method" Value="stop" /> 
       <RegistryValue Type="string" Name="Params" Value="stop" /> 
       <RegistryValue Type="string" Name="StdOutput" Value="auto" /> 
       </RegistryKey> 
       <RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\UpdaterService" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Description" Value="Kube updater service performing updates and installation" /> 
       <RegistryValue Type="string" Name="DisplayName" Value="UpdaterService" /> 
       <RegistryValue Type="string" Name="ImagePath" Value="E:\Service\prunsrv.exe.exe //RS//UpdaterService" /> 
       <RegistryValue Type="string" Name="DependsOnService" Value="Tcpip Afd" /> 
       <RegistryValue Type="string" Name="ObjectName" Value="LocalSystem" /> 
       <RegistryValue Type="integer" Name="ErrorControl" Value="1" /> 
       <RegistryValue Type="integer" Name="Start" Value="2" /> 
       <RegistryValue Type="integer" Name="Type" Value="16" /> 
       </RegistryKey> 
       <RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\UpdaterService\Parameters" Action="createAndRemoveOnUninstall"> 
       <RegistryValue Type="string" Name="Test" Value="Pass" /> 
       </RegistryKey> 
      </Component> 


      <Component Id="PROCRUN.EXE" DiskId="1" Guid="*" Win64="yes"> 
       <!-- this is the renamed procrun 64 bit executable --> 
       <File Id="prunsrv.exe" Name="prunsrv.exe" Source="E:\Service\prunsrv.exe" /> 
       <ServiceInstall Id="PROCRUN" Type="ownProcess" Name="UpdaterService" DisplayName="UpdaterService" Description="Kube 2.0 Updater Service" Start="auto" Account="LocalService" ErrorControl="normal" Arguments=" //RS//UpdaterService" /> 
       <ServiceControl Id="StartPRUNSRV" Start="install" Stop="both" Remove="uninstall" Name="UpdaterService" Wait="no" /> 
      </Component> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 
    </Fragment> 


</Wix> 

我指定了Win64 = yes参数。对于WIX安装项目,我还在项目设置 - >工具集 - >附加参数下指定了“-arch x64”。我仍然可以在正常的HKLM/SOFTWARES中创建注册表项,而不是在wow64节点中创建注册表项。这是为什么发生?请指教。

对于那些需要到32位注册表位置(Wow6432Node)你需要指定一个64位安装程序键Win64中=“无”

这是一个有点混乱,但Wow6432Node实际上是32注册表的一部分位于64位机器上,而不是64位部分。

+1

是的,WOW64在64位Windows上读取为(32位)Windows。 (只要可以运行64位Windows,Machine就不相关。) –