2009-12-10 3 views
32

Ho scritto un programma di installazione WiX che funziona perfettamente con Windows XP, ma quando si installa su un Windows 7 sono in difficoltà con le voci del registro. Devo aggiungere una voce HKLM e la voce di registro per il programma da mostrare nel menu di avvio. Ecco il codice che sto utilizzando per entrambi i tipi di immissione:WiX non aggiungerà l'impostazione del registro HKLM durante l'installazione di 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> 

Come posso risolvere questo problema?

Su una nota a margine, le autorizzazioni di registro sono le stesse sui computer Windows   XP e Windows   7.

+2

Sono stato in grado di trovare dove stavano andando le voci del Registro di sistema. In realtà vengono posizionati sotto il Wow6432Node. C'è un modo per farlo posizionare sotto la normale chiave del Registro di sistema anziché in Software \ Wow6432Node? –

risposta

31

Ho capito perché questo sta accadendo.

Con il programma di installazione WiX compilato su una piattaforma x86, Windows 7 lo ha rilevato come programma di installazione a 32 bit con chiavi di registro a 32 bit. Windows   7 64 bit gestisce voci di registro a 32 bit facendo solo ciò che ho visto accadere.

Il programma era ancora registrato; non era solo nella parte a 64 bit del registro. Compilalo sotto una piattaforma x64 mentre apporti le modifiche necessarie per renderlo un sistema a 64 bit (ProgramFileFolder diventa ProgramFiles64Folder, ecc.) E metterà le cose nel posto giusto.

+3

Forse vale la pena notare che si trova la voce in HKLM \ Software \ Wow6432Node \ [var.Manufacturer] \ [var.ProductName] – anhoppe

5

Ci sono alcune differenze nel modo in cui Windows 7 gestisce determinate chiavi del Registro di sistema. Riflessione del registro è stata rimossa a partire da Windows   7. Non sono sicuro che ciò avvenga in ciò che viene visualizzato qui, ma controlla su this link per ulteriori informazioni.

Inoltre, se si sta lavorando con una versione a 64 bit di Windows 7 si potrebbe essere in grado di approfondire alcune specifiche facendo riferimento allo MSDN 64-bit Windows Programming Guide.

Inoltre, se è necessario installare chiavi di registro diverse in posizioni diverse in base all'aspetto di Windows (XP, Vista, 7, ecc.), Anche this Stack Overflow question ha una risposta.

+0

Questo è stato molto utile e mi ha dato un'ulteriore comprensione del cambiamento dai sistemi 32 a 64 bit. –

17

Grazie fondamentalmente per aver risolto questo per me!

Volevo solo aggiungere che non è necessario modificare tutto per essere x64 perché funzioni, ma il componente in questione deve essere contrassegnato come 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> 

Annotare il Win64 = "yes", che è tutto ciò che è necessario per scrivere l'area a 64 bit del Registro di sistema. La condizione VersionNT64 è presente in modo che questo componente venga installato solo su un sistema x64.

Nel mio caso questo fornisce avvertimenti ICE80 perché voglio installare un componente a 64 bit nella ProgramFilesFolder a 32 bit. Sono felice di ignorarli perché la mia applicazione principale non è x64, solo l'estensione della shell è, e non voglio mettere l'estensione della shell nella sua cartella speciale.

+0

Lo faccio, ma fondamentalmente ti fa mettere le impostazioni del registro due volte - una volta con win64 = yes e condition VersionNT64 e l'altra con no e NOT VersionNT64 - per evitare di digitarle due volte puoi usare un file include, e quindi includi due volte lo stesso chunk e se gli avvisi ICE80 ti infastidiscono, puoi sopprimerli nelle pagine delle proprietà del progetto. – BrainSlugs83

Problemi correlati