2009-08-25 11 views
21

Más específicamente, quiero probar si Oracle ODP.Net está instalado en una máquina. Quiero hacer esto probando la clave de registro HKLM \ SOFTWARE \ ORACLE \ ODP.NET.En WiX, ¿cómo puedo probar la existencia de una clave de registro (no de valor) para Oracle ODP.Net

Los valores reales utilizados por ODP.Net se almacenan en HKLM \ SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20. Sin embargo, supongo que el nombre de esta clave de nivel inferior cambiará a medida que Oracle publique las actualizaciones.

He intentado lo siguiente que falla, posiblemente porque el valor (predeterminado) realmente no existe o posiblemente porque es nulo (no estoy seguro de cómo se representa exactamente en el registro).

<Property Id="ORACLE_ODPNET"> 
    <RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" Name="(Default)"/> 
</Property> 
<Condition Message="This setup requires ODP.Net to be installed."> 
    Installed OR ORACLE_ODPNET 
</Condition> 

Así que cualquiera de los siguientes sería útil para mí:

  • Una manera de buscar una clave de registro sin valores por debajo de ella.
  • Una manera de buscar un valor de registro utilizando una ruta que contiene comodines
  • Una mejor manera de probar la ODP.Net están instalando
+0

Gracias chicos! que utiliza la acción personalizada como se describe aquí: [http://stackoverflow.com/a/1340107][1] [1]: http://stackoverflow.com/a/1340107 – Viktor

+0

Por cierto, para obtener el valor predeterminado, debe omitir el atributo de nombre. –

Respuesta

17

OK, así que gracias a la información de Sascha parece que la respuesta es "no se puede" usar las funciones incorporadas del registro de WiX.

Ahora también quería que esta prueba ocurriera junto con las otras pruebas de condición de lanzamiento que la hacen un poco más difícil. Conseguir que esto funcione me ha llevado bastante tiempo, aunque ahora es bastante simple, sé cómo, así que espero que esto le ahorre a alguien más el mismo dolor.

En primer lugar crear una propiedad dentro de su Producto WiX:

<Property Id="ODPNETINSTALLED">0</Property> 

A continuación, cree una acción personalizada para comprobar si la tecla SET y ODPNETINSTALLED a "1" si es que existe. No voy a entrar en compilar y agregar la acción personalizada al instalador aquí, pero es bastante simple si usa Votive en Visual Studio. El código de mi acción personalizada es:

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Win32; 

namespace WiXCustomAction 
{ 
    public class CustomActions 
    { 
    [CustomAction] 
    public static ActionResult CheckOdpNetInstalled(Session xiSession) 
    { 
     xiSession.Log("Begin CheckOdpNetInstalled"); 

     RegistryKey lKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\ODP.Net"); 

     xiSession["ODPNETINSTALLED"] = lKey == null ? "0" : "1"; 

     return ActionResult.Success; 
    } 
    } 
} 

Ahora tiene que registrarse y programar la acción, porque quería que el aviso a aparecer junto con mis otras condiciones de inicio que tenía que añadirlo a la Instalación IU Secuencia elemento:

<Binary Id="WiXCustomAction.dll" SourceFile="$(var.WiXCustomAction.TargetDir)$(var.WiXCustomAction.TargetName).CA.dll" /> 
<CustomAction Id="CheckOdpNet" BinaryKey="WiXCustomAction.dll" DllEntry="CheckOdpNetInstalled" Execute="immediate" /> 
<InstallUISequence> 
    <Custom Action="CheckOdpNet" Before="LaunchConditions">NOT Installed</Custom> 
</InstallUISequence> 

Por último agregar una condición de inicio para comprobar la propiedad:

<Condition Message="!(loc.OracleOdpCondition)"> 
    Installed OR ODPNETINSTALLED="1" 
</Condition> 

Tenga en cuenta que yo creo que scheduli ng en InstallUISequence significa que la acción personalizada no se activará durante las instalaciones que no sean UI. Sin embargo, mi instalador debe tener una instalación de interfaz de usuario para que no sea un problema para mí.

6

simplemente omiten RegistrySearch/@ Nombre de obtener el "(por defecto) "valor". Lamentablemente, no hay forma de que sepa realizar una búsqueda recursiva, deberá elegir una clave de registro "conocida" que sea estable entre las versiones y basar su búsqueda en esa.

<Property Id="ORACLE_ODPNET"> 
    <RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" /> 
</Property> 
<Condition Message="This setup requires ODP.Net to be installed."> 
    Installed OR ORACLE_ODPNET 
</Condition> 
+2

Sí, sí. No hay búsqueda recursiva con RegistrySearch. –

+1

Gracias, pero yhis no parece funcionar para mí, ¿me estoy perdiendo algo obvio? Si miro en Regedit, el valor "(Predeterminado)" es su normal "(Valor no establecido)" ¿esto satisfará la condición de WiX? BTW Estoy usando WiX v3 si eso es importante. – Dan

+0

Creo que tendrá que buscar una clave de registro diferente en ese caso ... – saschabeaumont

Cuestiones relacionadas