2009-12-10 18 views
32

He escrito un instalador de WiX que funciona perfectamente con Windows XP, pero cuando instalo en una caja de Windows 7 me encuentro en dificultades con las entradas de registro. Necesito agregar una entrada de HKLM así como la entrada de registro para que el programa se muestre en el menú de inicio. Aquí está el código que estoy usando para ambos tipos de entrada:WiX no agregará configuración de registro HKLM durante la instalación de 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> 

¿Cómo puedo solucionar este problema?

En una nota lateral, los permisos de registro son los mismos en Windows   XP y Windows   7 computadoras.

+2

Pude encontrar a dónde iban las entradas del Registro. En realidad, están siendo colocados bajo el Wow6432Node. ¿Hay alguna manera de colocarlo bajo la clave de registro de software normal en lugar de Software \ Wow6432Node? –

Respuesta

31

He descubierto por qué sucede esto.

Con el instalador de WiX compilado en una plataforma x86, Windows 7 lo recogió como el instalador de 32 bits con claves de registro de 32 bits. Windows   7 64 bits maneja las entradas de registro de 32 bits haciendo lo que vi suceder.

El programa todavía estaba registrado; simplemente no estaba en la parte de 64 bits del registro. Compilarlo bajo una plataforma x64 mientras realiza los cambios necesarios para que sea para un sistema de 64 bits (ProgramFileFolder se convierta en ProgramFiles64Folder, etc.), y pondrá las cosas en el lugar correcto.

+3

Tal vez valga la pena señalar que encuentra la entrada en HKLM \ Software \ Wow6432Node \ [var.Manufacturer] \ [var.ProductName] – anhoppe

5

Existen algunas diferencias con la forma en que Windows 7 maneja ciertas claves de registro. Se eliminó la reflexión del registro comenzando con Windows   7. No estoy seguro de si esto se refleja en lo que está viendo aquí, pero consulte this link para obtener más información al respecto.

Además, si está trabajando con una versión de Windows 7 de 64 bits, es posible que pueda profundizar en algunos detalles haciendo referencia al MSDN 64-bit Windows Programming Guide.

Además, si necesita tener diferentes claves de registro instaladas en diferentes ubicaciones según el sabor de Windows (XP, Vista, 7, etc.), entonces this Stack Overflow question también tiene una respuesta para usted.

+0

Esto fue bastante útil y me dio una mayor comprensión del cambio de los sistemas de 32 a 64 bits. –

17

¡Gracias por resolverme este problema básicamente por mí!

Solo quería agregar que no necesariamente tiene que cambiar todo para que sea x64 para que esto funcione, solo el componente en cuestión debe marcarse como 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> 

Nota del Win64 = "sí", que es todo lo que se requiere para escribir en el área de 64 bits del registro. La condición de VersionNT64 está allí para que este componente solo se instale en un sistema x64.

En mi caso esto da advertencias de ICE80 porque quiero instalar un componente de 64 bits en ProgramFilesFolder de 32 bits. Me complace ignorar esto porque como mi aplicación principal no es x64, solo la extensión del shell es, y no quiero poner la extensión del shell en su propia carpeta especial.

+0

Hago esto, pero básicamente hace que coloque la configuración del registro dos veces: una con win64 = yes y condition VersionNT64 y la otra con no y NOT VersionNT64 - para evitar escribirlas dos veces, puede usar un archivo de inclusión, y luego simplemente incluya el mismo fragmento dos veces, y si las advertencias de ICE80 le están molestando, puede suprimirlas en las páginas de propiedades del proyecto. – BrainSlugs83

Cuestiones relacionadas