Dans Wix comment puis-je vérifier l'existence d'une (valeur non) clé de Registre pour Oracle ODP.Net

StackOverflow https://stackoverflow.com/questions/1327203

  •  19-09-2019
  •  | 
  •  

Question

Plus précisément je veux tester si est installé sur une machine Oracle ODP.Net. Je veux le faire en testant le HKLM \ SOFTWARE \ ORACLE \ clé de Registre ODP.NET.

Les valeurs réelles utilisées par ODP.Net sont stockés dans HKLM \ SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20 mais je suppose que ce nom de clé de niveau inférieur changera à mesure que les mises à jour sont publiées par Oracle.

J'ai essayé ceci qui échoue, peut-être parce que le (par défaut) valeur n'existe pas vraiment ou peut-être parce qu'il est nul (je ne sais pas exactement comment il est représenté dans le registre).

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

Donc une des options suivantes serait utile pour moi:

  • Une façon de rechercher une clé de Registre sans valeurs en dessous.
  • Une façon de rechercher une valeur de registre en utilisant un chemin d'accès contenant des caractères génériques
  • Une meilleure façon de tester ODP.Net en cours d'installation
Était-ce utile?

La solution

OK, grâce à l'information de Sascha il semble que la réponse est « vous ne pouvez pas » en utilisant les fonctions de registre WiX intégré.

Maintenant, je voulais aussi ce test pour arriver en même temps que les autres tests de condition de lancement qui le rend un peu plus difficile. Obtenir ce au travail m'a pris tout à fait un certain temps mais il est assez simple maintenant je sais comment, si nous espérons que cela sauvera quelqu'un d'autre la même douleur.

Tout d'abord créer une propriété dans votre produit WiX:

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

Ensuite, créez une action personnalisée pour vérifier la clé et un ensemble ODPNETINSTALLED à « 1 » si elle existe. Je ne vais pas aller dans la compilation et l'ajout de l'action personnalisée à l'installateur ici, mais il est assez simple si vous utilisez Votive dans Visual Studio. Le code pour mon action personnalisée est:

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;
    }
  }
}

Maintenant, vous devez vous inscrire et de planifier l'action, parce que je voulais l'avertissement apparaître en même temps que mes autres conditions de lancement je devais l'ajouter à l'installation interface élément de séquence:

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

Enfin ajouter une condition de lancement pour vérifier la propriété:

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

Notez que je crois que l'ordonnancement dans InstallUISequence signifie l'action personnalisée ne sera pas tiré lors des installations non-UI. Cependant, mon installateur doit avoir l'interface utilisateur d'installer il est donc pas un problème pour moi.

Autres conseils

omettent simplement RegistrySearch / @ Nom pour obtenir le "(par défaut)" valeur. Malheureusement, il n'y a aucun moyen que je suis au courant de faire une recherche récursive, vous allez avoir besoin de choisir une clé de Registre « connue » qui sera stable entre les versions et la base de votre recherche de cela.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top