2009-08-25 19 views
21

具体的には、Oracle ODP.Netがマシンにインストールされているかどうかをテストします。私は、HKLM \ SOFTWARE \ ORACLE \ ODP.NETレジストリキーをテストすることでこれを行いたいと思います。WiXの場合Oracle ODP.Netのレジストリキー(値ではありません)の存在をテストする方法

ODP.Netで使用される実際の値は、HKLM¥SOFTWARE¥ORACLE¥ODP.NET¥2.111.6.20に格納されていますが、この下位レベルのキーの名前はOracleによって更新がリリースされると変更されると仮定します。

(デフォルト)値が実際には存在しないか、またはnull(おそらくレジストリにどのように表現されているかわからないため)が原因で失敗する可能性があります。だから、

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

次のいずれかは私には参考になる:

  • 、その下に無い値で キーのレジストリを検索する方法。
  • ODP.Net をテストするためのより良い方法が
+0

ありがとうございました! 、ここで説明したように、私はカスタムアクションを使用:[http://stackoverflow.com/a/1340107][1] [1]:http://stackoverflow.com/a/1340107 – Viktor

+0

Default値を取得するには、Name属性を省略する必要があります。 –

答えて

17

OK、Saschaの情報のおかげで、その答えは組み込みのWiXレジストリ関数を使って "できません"と思われます。

もう少し難しくなる他の起動条件テストと一緒にこのテストを実行したかったのです。これがうまくいくと、私はかなり時間がかかりましたが、今はかなりシンプルです。どのようにすればいいのでしょうか。そうすれば、誰かに同じ痛みを救うことができます。

まず、あなたのWiX製品内部のプロパティを作成します。

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

を次にそれが存在する場合に「1」ODPNETINSTALLEDキーとセットをチェックするためにカスタムアクションを作成します。私はここでコンパイルしてカスタムアクションをインストーラに追加するつもりはありませんが、Visual StudioでVotiveを使用するとかなり簡単です。私のカスタムアクションのためのコードは次のとおりです。

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

私は私がインストールUIシーケンスに追加しなければならなかった私の他の起動条件と一緒に表示される警告を望んでいたので、今、あなたは、アクションを登録し、スケジュールを設定する必要があります要素:

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

最後にプロパティをチェックする起動条件を追加します。私はscheduliと信じ

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

注意InstallUISequenceでは、UI以外のインストール中にカスタムアクションが起動されないことを意味します。しかし、私のインストーラにはUIがインストールされている必要がありますので、それは私の問題ではありません。

6

をインストールされているワイルドカード

  • を含むパスを使用して、レジストリ値 を検索する方法を単に「(既定値を取得するためにRegistrySearch/@名を省略) "値。残念なことに、再帰的な検索を行う方法は知られていません。リリース間で安定する「既知の」レジストリキーを選択し、そこから検索を行う必要があります。

    <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

    うん、そう。 RegistrySearchによる再帰的検索はありません。 –

    +1

    ありがとう、しかし、私のために働いていないようです、私は何か明白な行方不明ですか? Regeditを見ると "(デフォルト)"の値は通常の "(値が設定されていない)"です。これはWiXの条件を満たすでしょうか? 私はWiX v3を使用しています。重要です。 – Dan

    +0

    あなたはその場合に別のレジストリキーを探す必要があると思います... – saschabeaumont

    関連する問題