2009-12-10 15 views
32

Napisałem instalator WiX, który działa doskonale z systemem Windows XP, ale podczas instalacji do systemu Windows 7 mam problem z wpisami rejestru. Należy dodać wpis HKLM, a także wpis rejestru, aby program był wyświetlany w menu Start. Oto kod, którego używam dla obu typów wpisu:WiX nie doda ustawienia rejestru HKLM podczas instalacji systemu Windows 7

<!-- 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> 

Jak mogę rozwiązać ten problem?

Na marginesie, uprawnienia rejestru są takie same na komputerach z systemem Windows   XP i Windows  .

+2

Udało mi się znaleźć miejsce, w którym wpisy rejestru się odbywały. W rzeczywistości są one umieszczane pod Wow6432Node. Czy istnieje sposób na umieszczenie go pod zwykłym kluczem rejestru oprogramowania zamiast oprogramowania \ Wow6432Node? –

Odpowiedz

31

Rozumiem, dlaczego tak się dzieje.

Podczas instalacji kompilatora WiX na platformie x86 system Windows 7 wybrał go jako 32-bitowy instalator z 32-bitowymi kluczami rejestru. Windows   7 64-bitowy obsługuje wpisy rejestru w trybie 32-bitowym, wykonując dokładnie to, co widziałem.

Program był nadal zarejestrowany; to nie było w 64-bitowej części rejestru. Skompiluj go pod platformą x64, dokonując niezbędnych zmian, aby uczynić go systemem 64-bitowym (ProgramFileFolder stał się ProgramFiles64Folder, itp.), I umieści rzeczy we właściwym miejscu.

+3

Być może warto zauważyć, że wpis znajduje się pod HKLM \ Software \ Wow6432Node \ [var.Manufacturer] \ [var.ProductName] – anhoppe

5

Istnieją pewne różnice w sposobie obsługi niektórych kluczy rejestru w systemie Windows 7. Odbicie rejestru zostało usunięte, zaczynając od systemu Windows   7. Nie jestem pewien, czy to zagra w to, co widzisz tutaj, ale sprawdź na this link.

Ponadto, jeśli pracujesz z 64-bitową wersją systemu Windows 7, możesz zapoznać się ze szczegółami, odnosząc się do MSDN 64-bit Windows Programming Guide.

Co więcej, jeśli potrzebujesz różnych kluczy rejestru zainstalowanych w różnych lokalizacjach w oparciu o smak systemu Windows (XP, Vista, 7, itp.), Wtedy this Stack Overflow question również ma dla ciebie odpowiedź.

+0

To było bardzo pomocne i pozwoliło mi lepiej zrozumieć zmianę z 32 do 64-bitowych systemów. –

17

Dzięki za rozwiązanie tego w zasadzie dla mnie!

Chciałem tylko dodać, że niekoniecznie trzeba wszystko zmienić na x64, aby to działało, tylko dany komponent musi być oznaczony jako 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> 

Zanotuj Win64 = "yes", to wszystko, co jest wymagane do zapisu w obszarze 64-bitowego rejestru. Warunek VersionNT64 istnieje, więc ten komponent zostanie zainstalowany tylko w systemie x64.

W moim przypadku daje to ostrzeżenia ICE80, ponieważ chcę zainstalować składnik 64-bitowy w 32-bitowym programieFileFolder. Cieszę się, że mogę je zignorować, ponieważ ponieważ moją główną aplikacją nie jest x64, tylko rozszerzenie powłoki jest i nie chcę umieszczać rozszerzenia powłoki w jego własnym specjalnym folderze.

+0

Robię to, ale w zasadzie powoduje to dwukrotne ustawienie ustawień rejestru - jeden raz z win64 = yes i warunek VersionNT64, a drugi bez i NOT VersionNT64 - aby uniknąć dwukrotnego wpisywania ich, można użyć pliku włączającego i następnie po prostu włącz tę samą porcję dwa razy - i jeśli ostrzeżenia ICE80 Cię niepokoją, możesz je wyłączyć na stronach właściwości projektu. – BrainSlugs83

Powiązane problemy