es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estableciendo el valor del registro en Wix 3.11 condicionalmente usando VBScript.

Espero poder escribir un pequeño VBScript en Wix 3.11 que compruebe si una entrada de registro particular tiene un valor.

Básicamente, si HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell = “ruta_de_la_unidad:\ruta\hacia\esteNombreDeAplicación.exe”, queremos reemplazarlo con la nuestra. Sólo necesitamos saber que thisAppName.exe se utiliza como shell actual. (también conocido como subcadena…) La declaración XML de Condición no parece soportar la funcionalidad de subcadena.

Cuando depuro el VBScript, el valor siempre está vacío y la propiedad de sesión también está vacía. Esto me sugiere que algo se está ejecutando fuera de secuencia.

Debido a la pequeña cantidad de código de secuencias de comandos, tiene sentido mantenerlo en el código de Wix. Espero no tener que mover esto a un módulo personalizado, ya que esto parece exagerado para lo que se necesita.

<wix>
<product>
...
<property id=""SHELL_KEY"">
  <registrysearch id=""REG_SHELL_KEY"" root=""HKLM"" key=""SOFTWARE\Microsoft\Windows" nt\currentversion\winlogon"="" name=""Shell"/">
</registrysearch></property>

<customaction id=""REGISTRYKEYCHECK"" script=""vbscript"" execute=""immediate"" return=""ignore"">
  <![CDATA[
  Dim value 
  value = Session.Property("SHELL_KEY")
  IF INSTR(value, "thisAppName.exe") > 0 THEN 
    Session.Property("RESET_SHELL_KEY") = "1"
  END IF
  ]]>
</customaction>

<installexecutesequence>
  <custom action=""REGISTRYKEYCHECK"" before=""CostFinalize"">1</custom>
</installexecutesequence>

...

<directory>

...

<component id=""ResetShellExe"" guid=""{....}""></component><condition><![CDATA[RESET_SHELL_KEY]]></condition>
    <registrykey root=""HKLM"" key=""SOFTWARE\Microsoft\Windows" nt\currentversion\winlogon"="">
      <registryvalue type=""string"" name=""Shell"" value=""$(var.MyProgram.TargetFileName)"" keypath=""no"/">
    </registryvalue></registrykey>


<feature id=""Complete"" level=""1"">
   ...
  <componentref id=""ResetShellExe"/">
</componentref></feature>

...
</directory></product>
</wix>
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    El problema parece estar en el elemento RegistrySearch dentro del elemento Property. El atributo Name debe estar configurado en una cadena vacía para que el elemento Property recupere el valor predeterminado de la clave del registro.

    <Wix>
    <Product>
    ...
    <Property Id="SHELL_KEY">
      <RegistrySearch Id="REG_SHELL_KEY" Root="HKLM" 
          Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" 
          Name=""/>
    </Property>
    
    <CustomAction Id="REGISTRYKEYCHECK" Script="vbscript" Execute="immediate" Return="ignore">
      <![CDATA[
      Dim value 
      value = Session.Property("SHELL_KEY")
      IF INSTR(value, "thisAppName.exe") > 0 THEN 
        Session.Property("RESET_SHELL_KEY") = "1"
      END IF
      ]]>
    </CustomAction>
    
    <InstallExecuteSequence>
      <Custom Action="REGISTRYKEYCHECK" Before="CostFinalize">1</Custom>
    </InstallExecuteSequence>
    
    ...
    
    <Directory>
    
      ...
    
      <Component Id="ResetShellExe" Guid="{....}"
        <Condition><![CDATA[RESET_SHELL_KEY]]</Condition>
        <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon">
          <RegistryValue Type="string" Name="Shell" Value="$(var.MyProgram.TargetFileName)" KeyPath="no"/>
        </RegistryKey>
      </Component>
    
    <Feature Id="Complete" Level="1">
       ...
      <ComponentRef Id="ResetShellExe"/>
    </Feature>
    
    ...
    </Product>
    </Wix>
    

    Consulte este enlace para obtener más información.

Comments are closed.