2009-12-10 79 views
32

我已經編寫了一個與Windows XP完美配合的WiX安裝程序,但是當安裝到Windows 7時,我遇到了註冊表項的問題。我需要添加一個HKLM條目以及該程序的註冊表條目以顯示在開始菜單中。以下是我用於兩種類型的條目的代碼:在Windows 7安裝過程中,WiX不會添加HKLM註冊表設置

<!-- Create the registry entries for the program --> 
<DirectoryRef Id="TARGETDIR"> 
    <Component Id="RegistryEntriesInst" Guid="..."> 
    <RegistryKey Root="HKLM" 
       Key="Software\$(var.Manufacturer)\$(var.ProductName)" 
      Action="createAndRemoveOnUninstall"> 
     <RegistryValue 
      Type="string" 
      Name="installed" 
      Value="true" 
      KeyPath="yes"/> 
    </RegistryKey> 
    </Component> 
    <Component Id="RegistryEntriesVer" Guid="..."> 
    <RegistryKey Root="HKLM" 
       Key="Software\$(var.Manufacturer)\$(var.ProductName)" 
      Action="createAndRemoveOnUninstall"> 
     <RegistryValue 
      Type="string" 
      Name="version" 
      Value="$(var.ProductVersion)" 
      KeyPath="yes"/> 
    </RegistryKey> 
    </Component> 
</DirectoryRef> 

<!-- To add shortcuts to the start menu to run and uninstall the program --> 
<DirectoryRef Id="ApplicationProgramsFolder"> 
    <Component Id="ApplicationShortcut" Guid="..."> 
    <Shortcut Id="ApplicationStartMenuShortcut" 
       Name="$(var.ProductName)" 
       Description="..." 
       Target="[SERVERLOCATION]$(var.Project.TargetFileName)" 
       WorkingDirectory="SERVERLOCATION"/> 
    <Shortcut Id="UninstallProduct" 
        Name="Uninstall $(var.ProductName)" 
        Description="..." 
        Target="[System64Folder]msiexec.exe" 
        Arguments="/x [ProductCode]"/> 
    <RemoveFolder Id="SERVERLOCATION" On="uninstall"/> 
    <RegistryValue 
     Root="HKCU" 
     Key="Software\$(var.Manufacturer)\$(var.ProductName)" 
     Name="installed" 
     Type="integer" 
     Value="1" 
     KeyPath="yes"/> 
    </Component> 
</DirectoryRef> 

如何解決此問題?

在旁註中,註冊表權限在Windows XP和Windows XP上是相同的。

+2

我能夠找到註冊表項目的去向。他們實際上被放置在Wow6432Node下。有沒有辦法將它置於正常的Software Registry Key而不是Software \ Wow6432Node下? – 2009-12-10 18:03:57

回答

31

我已經知道爲什麼會發生這種情況。

隨着WiX安裝程序在x86平臺上編譯,Windows 7將其作爲帶有32位註冊表項的32位安裝程序進行挑選。 Windows   7通過執行我所看到的操作,64位處理32位註冊表項。

程序還在註冊中;它只是不在註冊表的64位部分。在64位平臺上進行編譯,同時進行必要的更改以使其適用於64位系統(ProgramFileFolder變爲ProgramFiles64Folder等),並將其放在正確的位置。

+3

也許值得注意的是,您可以在HKLM \ Software \ Wow6432Node \ [var.Manufacturer] \ [var。ProductName] – anhoppe 2016-02-16 08:14:01

5

Windows 7如何處理某些註冊表項有一些差異。註冊表反射從Windows開始被刪除  7.我不確定這是否會影響到您在這裏看到的內容,但請查看this link瞭解更多。另外,如果您使用的是Windows 7的64位版本,則可以參考MSDN 64-bit Windows Programming Guide深入瞭解一些具體情況。此外,如果您需要根據Windows風格(XP,Vista,7等)將不同的註冊表項安裝到不同的位置,那麼this Stack Overflow question也對您有所幫助。

+0

這非常有幫助,並讓我進一步瞭解從32位系統到64位系統的變化。 – 2009-12-10 19:23:56

17

感謝您基本上爲我解決這個問題!

我只是想補充一點,你不一定需要將所有東西都改爲x64才能工作,只有問題的組件需要標記爲x64。

<Component Id="MyShellExtension64.dll" Guid="..." Win64="yes"> 
    <Condition>VersionNT64</Condition> 
    <File 
    Name="MyShellExtension64.dll" 
    Source="MyShellExtension64.dll" 
    KeyPath="yes"/> 
    <RegistryValue 
    Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" 
    Name="{GUID}" Value="My Shell Extension" Type="string"/> 
</Component> 

注意Win64中=「是」,這是所有需要寫入註冊表的64位區域。 VersionNT64條件存在,因此該組件只能安裝在x64系統上。

在我的情況下,這給ICE80警告,因爲我想在32位ProgramFilesFolder中安裝一個64位組件。我很高興忽略這些,因爲我的主應用程序不是x64,只有外殼擴展名,我不想把外殼擴展到它自己的特殊文件夾中。

+0

我這樣做,但它基本上讓你把註冊表設置兩次 - 一次與win64 =是和條件版本NT64和其他沒有和NOT版本NT64 - 避免鍵入他們兩次,你可以使用包含文件,和那麼只需兩次包含相同的塊 - 並且如果ICE80警告正在擾亂您,則可以在項目屬性頁面中禁用它們。 – BrainSlugs83 2013-01-17 06:19:56

相關問題