.NETプログラミング研究 第56号 †.NET Tips †デプロイメントプロジェクトの起動条件エディタの使い方 †
ここではデプロイメントプロジェクトの「起動条件エディタ」の使い方について説明します。ヘルプでは、「配置での起動条件の管理」で説明されていますので、こちらも参考にしてください。 デプロイメントプロジェクトの「起動条件エディタ」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件を満たさなければメッセージを表示して、インストールできないようにすることができます。また、指定された条件のファイル、レジストリ、Componentを検索することができます。 起動条件エディタでは、「対象コンピュータ上の検索」と「起動条件」を指定することができます。まずは「起動条件」から説明します。 起動条件の使い方 †「起動条件」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件が満たされなければメッセージを表示して、インストールできないようにすることができます。条件の判断は、インストールの開始時に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのLaunchConditionsアクションを実行している位置です)。ここで使用される条件は通常Propertyの値を使用したものであり、Windows Installerが定義したPropertyや、「対象コンピュータの検索」の結果が入るProperty(詳細後述)等を使用します。なおここで指定された設定は、Windows InstallerデータベースのLaunchConditionテーブルに反映されます。 何はともあれ、「起動条件」をいじってみましょう。デプロイメントプロジェクトで起動条件エディタを表示し、「起動条件」と書かれたノードを右クリックします。表示されるメニューから「起動条件の追加」をクリックすると、起動条件が追加されます。 起動条件のプロパティには、「Condition」、「InstallUrl」、「Message」の3つがあります。このうちConditionに条件を指定し、Messageで条件が満たされずにインストールが失敗した時に表示されるメッセージを指定します。InstallUrlにURLやパス名を指定した場合は、メッセージが表示された後に、指定されたURLやファイルが開きます。ファイルのパスを指定する時は、インストーラの位置からの相対パスで指定します。 Conditionには、Trueと評価された場合にインストーラが実行されるような条件を指定します。Conditionプロパティはインストールするファイルのプロパティや、レジストリのプロパティにもありますが、使い方はこれらと同じです。ここでははじめに、Conditionをどのように記述すればよいのか解説します。 まずは、Conditionで使用するPropertyとして、Windows Installerが定義したPropertyについて説明します。Windows Installerが定義したプロパティは、「Platform SDK: Windows Installer」で紹介されています。 以下に、起動条件で使えそうなプロパティを幾つか紹介します。なお、説明は簡単にしているため、正確ではなく、かつWindows Installerのバージョンに依存するものもあります。必ずSDKで確認してください。
また、条件式の文法としては、=、<、>、<>、<=、>=などの比較演算子や、Not、And、Or、Xorなどの論理演算子を使うことができます。詳しくは、次のURLをご覧ください。 次にConditionの具体例を紹介します。例えば、Windows 2000 SP4以降をインストールの条件とするならば、次のようにします。 VersionNT>=500 And ServicePackLevel>=4 画面のサイズが800x600以上、色数がHigh Color(16ビット)以上を起動条件とするならば、次のようにします。 ScreenX>=800 And ScreenY>=600 And ColorBits>=16 ファイル検索 †「対象コンピュータ上の検索」では、「ファイル検索」、「レジストリ検索」、「Windows インストーラ検索」を追加することができます。まずは「ファイル検索」について説明します。 「ファイル検索」では、指定された条件のファイルを検索し、見つかれば指定されたPropertyにファイルのパスをセットします。このPropertyを「起動条件」に指定すれば、ファイルが見つかった時、あるいは見つからなかった時のみにインストーラを実行することが出来るようになります。なお、「ファイル検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、DrLocator、Signatureテーブルです。 このファイル検索(「対象コンピュータ上の検索」すべて)は、インストーラの開始時、「起動条件」の判断前に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのAppSearchアクションを実行している位置です)。 ファイル検索をデプロイメントプロパティに追加するには、「対象コンピュータ上の検索」ノードを右クリックし表示されるメニューから「ファイル検索の追加」を選択します。 追加されたファイル検索のプロパティの内、最低指定すべきものは、FileName、Folder、Depth、Propertyとなるでしょう。FileNameに検索するファイルの名前、Folderにファイルを検索するフォルダ、DepthにFolderでファイルを検索する深さ(0以上の整数、0でそのフォルダのみ検索)、Propertyに見つかったファイルのパスをセットするProperty名(注)を指定します。 注.Propertyには定義済みのWindows Installerプロパティまたはカスタムプロパティを指定できますが、カスタムプロパティでは大文字を使用する必要があります。 次に具体例を示します。「Msjet40.dll」というファイルがシステムフォルダに存在しているか調べ、なければインストールできないようにしてみましょう。 まず上記のようにファイル検索をプロジェクトに追加します。そして、FileNameプロパティに「Msjet40.dll」、Folderプロパティに「[SystemFolder]」(注)、Depthに「0」、Propertyに「FILEEXISTS1」(デフォルト)と入力します。 注.Folderで使用するPropertyについては、「Platform SDK: Windows Installer」の「System Folder Properties」を参考にしてください。 次にこのファイルが見つかった時のみインストーラが実行できるように、起動条件を追加します。まず先に説明したように「起動条件」を追加し、Conditionに「FILEEXISTS1」と入力し、Messageに適当なメッセージを入力します。 以上で「Msjet40.dll」がシステムフォルダにあるときのみインストーラが実行されるようになります。 ファイルの検索をさらに更新日、サイズ、バージョンで絞り込むこともできます。それには、以下のプロパティを使用しなければなりません。
レジストリ検索 †「レジストリ検索」では、指定されたレジストリ値を検索し、見つかれば指定されたプロパティにその値のデータをセットします。なお、「レジストリ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、RegLocatorテーブルです。 レジストリ検索プロパティでは、Rootに検索するレジストリルート、RegKeyに検索するレジストリキー、Valueに検索するレジストリ値、Propertyに見つかったレジストリ値のデータをセットするPropertyを指定します。 レジストリ検索を使用した例としては、MSDNの「Microsoft Data Access Components の起動条件の追加」が参考になります。 MDAC2.7以上がインストールされていることを起動条件とするには、次のようにします。まず、「対象コンピュータ上の検索」ノードを右クリックし表示されるメニューから「レジストリ検索の追加」を選択します。追加されたレジストリ検索のプロパティのRootを「vsdrrHKLM」、RegKeyを「Software\Microsoft\DataAccess」、Valueを「FullInstallVer」、Propertyを「REGISTRYVALUE1」(デフォルト)と変更します。これでレジストリキー「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess」に「FullInstallVer」という値があったときにそのデータが「REGISTRYVALUE1」にセットされます。このREGISTRYVALUE1が2.7以上であることを起動条件とするために、Conditionが「REGISTRYVALUE1>="2.7"」という起動条件を追加します。 Windowsインストーラ検索 †「Windowsインストーラ検索」では、指定されたComponentがコンピュータにインストールされているか調べ、見つかれば指定されたプロパティにComponentがインストールされているフォルダのパスをセットします。なお、「Windowsインストーラ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、CompLocatorテーブルです。 Componentとは、Windows Installerがインストール(あるいはアンインストール)する項目の最小の塊とでも言えるでしょうか。詳しい説明は、MSDNをご覧ください。 「Windowsインストーラ検索」では、検索するComponentのIDを「ComponentID」に指定する必要がありますが、MSDNに書いてあるように、このIDを知る術がVS.NETにはありません。 どうやら、ComponentIDを知るには、Orcaのようなツールを使うしかないようです。OrcaはWindows Installerデータベースの編集を行うためのツールで、Windows Installer SDKに含まれています。 IDを調べたいComponentのあるMSIファイルをOrcaで開き、Componentテーブルを開くと、登録されているComponentが表示されます。このComponentID列にある文字列が目的のComponentIDです。例えば、あるファイルがどのComponentに属しているか調べるには、Fileテーブルで調べたいファイルを見つけ、そのComponent_列のIDで示されるComponentを探せばよいわけです。 このようにして見つけたComponentIDを「Windowsインストーラ検索」のComponentIDプロパティに指定することにより、そのComponentがインストールされているか検索することができます。 補足:現在コンピュータにインストールされているComponentを調べるには、WindowsInstaller.InstallerオブジェクトのComponentsプロパティを調べることにより可能です。この方法は、「Simple Talk ≫ Blog Archive ≫ Getting started with setup projects」で紹介されており、コンピュータにインストールされているすべてのComponentを列挙するVBScriptのコードがあります。 インターネットインフォメーションサービス起動条件 †「対象コンピュータ上の必要条件」ノードを右クリックすることにより表示されるメニューから、「インターネットインフォメーションサービス起動条件の追加」を選択することにより、コンピュータにインターネットインフォメーションサービス(IIS)がインストールされていることを起動条件に追加することができます。 実際にインターネットインフォメーションサービス起動条件の追加を行うと、「対象コンピュータの検索」にレジストリキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters」の「MajorVersion」値を検索する設定が追加され、「起動条件」に検索された値が4以上(Conditionが「REGISTRYVALUE1 >= "#4"」)とする設定が追加されます。 補足:「REGISTRYVALUE1 >= "#4"」の「#」は、取得されるレジストリ値の型がDWORDとなるために付ける必要があります。詳しくは、上記に紹介したリンク「RegLocator Table」のRemarksをご覧ください。 このようにデフォルトではIISのバージョンが4以上を起動条件としますが、これを変更する時は、「起動条件」のConditionの「4」を適当な数字に変更します。 .NET Framework起動条件 †「インターネットインフォメーションサービス起動条件」と同様の方法により、「.NET Framework起動条件」を追加することができます。.NET Framework起動条件を追加すると、.NET Frameworkがコンピュータにインストールされていなければインストールされないようになります。なお、.NET Framework起動条件は、インストールするアプリケーションが.NET Frameworkを使用していると自動的に追加され、削除できなくなります。 「.NET Framework起動条件」が持つプロパティは次の3つです。SupportedRuntimesプロパティでは、必要な.NET Frameworkのバージョンを指定します。バージョンを複数指定するには、それぞれをセミコロンで区切ります。例えば、.NET Framework 1.0と1.1のどちらかがインストールされていることを起動条件とするならば、「1.1.4322;1.0.3705」とします。InstallUrlには、指定された.NET Frameworkがインストールされていなかった時に表示するURLやファイルのパスを指定します(注)。通常は、.NET Framework再頒布可能パッケージがダウンロードできるURLや、dotnetfx.exeへのパスを指定します。Messageには、指定された.NET Frameworkがインストールされていなかった時に表示するメッセージを指定します。 注.指定された.NET Frameworkがインストールされていない時、Messageプロパティを変更していなければ、「このセットアップは.NET Framework バージョン X.X.XXXXX を必要とします。.NET Frameworkをインストールして、このセットアップをやり直してください。.NET FrameworkはWebから取得できます。今すぐ取得しますか?」というメッセージと、「はい」「いいえ」ボタンを持つダイアログが表示されます。ここでユーザーが「はい」を選択した場合のみInstallUrlが表示されます。InstallUrlを省略した時は、「このセットアップは.NET Framework バージョン X.X.XXXXX を必要とします。.NET Frameworkをインストールして、このセットアップをやり直してください。」というメッセージと、「OK」ボタンのみのダイアログが表示されます。 ところで、前号で紹介したように、.NET Frameworkがインストールされているかどうかはレジストリを調べて判断することができますので、「インターネットインフォメーションサービス起動条件」と同様にレジストリ検索と起動条件を使って.NET Frameworkの存在をチェックできそうですが、VS.NETではそうしていません。 Orcaを使ってこの「.NET Framework起動条件」が何をしているのか調べてみると、カスタムアクションを使っていることが分かります。まず、Binaryテーブルに「MSVBDPCADLL」というDLLを埋め込みます。CustomActionテーブルにMSVBDPCADLLのCheckFXとVsdLaunchConditionsを呼び出すアクションを登録し、InstallExecuteSequenceとInstallUISequenceテーブルにこれらのアクションを追加します。CheckFXはAppSearchアクションの前、VsdLaunchConditionsはLaunchConditionsアクションの直前に呼び出されます。しかしこれらが具体的に何をしているのかまでは残念ながら分かりません。ちなみに、この「MSVBDPCADLL」が埋め込まれることにより、MSIファイルは200KB以上サイズが大きくなります。 コメント †
|