22

具体的には、OracleODP.Netがマシンにインストールされているかどうかをテストしたいと思います。HKLM \ SOFTWARE \ 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をテストするためのより良い方法
4

2 に答える 2

19

さて、Saschaの情報のおかげで、組み込みのWiXレジストリ機能を使用することは「できない」という答えのようです。

今、私はこのテストを他の起動条件テストと一緒に実行したかったので、少し難しくなりました。これを機能させるにはかなりの時間がかかりましたが、今ではかなり簡単ですが、方法がわかったので、これで他の誰かが同じ苦痛を軽減できることを願っています。

まず、WiX製品内にプロパティを作成します。

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

次に、キーをチェックするカスタムアクションを作成し、ODPNETINSTALLEDが存在する場合は「1」に設定します。ここでは、カスタムアクションをコンパイルしてインストーラーに追加することはしませんが、VisualStudioで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>

最後に、起動条件を追加してプロパティを確認します。

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

InstallUISequenceでのスケジューリングは、UI以外のインストール中にカスタムアクションが実行されないことを意味すると私は信じていることに注意してください。ただし、インストーラーにはUIがインストールされている必要があるため、問題にはなりません。

于 2009-08-27T10:14:03.317 に答える
8

RegistrySearch / @ Nameを省略して、「(デフォルト)」値を取得します。残念ながら、再帰検索を実行する方法はありません。リリース間で安定している「既知の」レジストリキーを選択し、そこから検索を行う必要があります。

<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>
于 2009-08-25T11:51:17.923 に答える