このページはアーカイブされた古いページです。
インストーラ講座の目次へ



Windows インストーラ講座 − 任意のタイミングで独自のスクリプトを実行する方法
Windows Installerでは、独自の動作(カスタムアクション)を実装することができます。
カスタムアクションには、下記6種類があります。
1.DLLファイルの呼出

主にC言語で作成されたDLLを呼び出して実行し、戻り値を返します。(VB製のDLLや.NET Framework製品は利用できません。)
2.WSH(スクリプト)の呼出

WSH(Windows Scripting Host)のスクリプトファイル(VBScriptやJScript)を呼び出し、戻り値を返します。
上記DLLファイルと似ており、また開発環境が不要なためお手軽ですが、ウイルス対策ソフトに実行を制限されたり、WSHランタイムが必要(Win2000以降からOSに標準装備)です。
DLLに比べて実行の確実性が低く、また実行できなかった場合に戻り値として0(ゼロ)(=成功と同意)が返ることから、採用には注意が必要です。
3.EXEファイルの実行

あらゆる言語でコンパイルされた実行形式のファイル(exe形式)を実行します。
Windows Installar側で戻り値を得ることはできないため、自己完結型の処理にのみ利用できます。
一例として、「インストール完了後にプログラムを実行する方法」の章を参考にしてください。
4.プロパティまたはディレクトリプロパティの設定

インストーラ作成時点では確定することができないプロパティをセットします。
このようなプロパティの例として、「アップグレード(バージョンアップ)の考え方」の章で述べたREINSTALLプロパティやREINSTALLMODEプロパティなどがあります。
5.メッセージの表示

メッセージボックスを表示することができます。またメッセージの表示後に、インストールを中止することもできます。
一例として、「Major Upgrade」の章の「6.カスタムアクションを作成」を参考にしてください。
6.ネストインストールの実行(インストールまたはアンインストール)

製品のインストーラとは別のインストールを行うことができます。例えば、姉妹製品の共用ファイルのインストールなどに利用します。
ここでは、アプリケーションのバージョンアップに伴いインストーラをWindows Installer対応とした場合を想定し、既存のアプリケーション(Windows Installerに非対応の古いバージョン)を削除する例として、WSHを利用したカスタムアクションの作成方法を説明します。具体的には、Orca を用いて、以下のように設定します。

1. スクリプトファイルを準備
メモ帳で以下のスクリプトを記入し、適当な名前「***.vbs」で保存します。

'--------------------------------------------------------------

Option Explicit

Function RunUninstall()

 On Error Resume Next


 '定数宣言
 Const APP_UNISTALLEID="SAMPLESOFT" '★適宜変更
 Const APP_TITLE="サンプルソフト" '★適宜変更


 '定数宣言
 Const ERROR_SUCCESS=0
 Const ERROR_INSTALL_USEREXIT=1602


 'オブジェクト作成
 Dim objWshShell

 Set objWshShell=WScript.CreateObject("WScript.Shell")

 If objWshShell Is Nothing Then 'Installerがホストの場合は、WScriptオブジェクトを使えないので、VBSのCreateObject関数を使う
  Set objWshShell=CreateObject("WScript.Shell")
 End If

 If objWshShell Is Nothing Then

  If Msgbox("最新版をインストールする前に、旧バージョンを手動で削除する必要があります。" & _
      Chr(13) & "インストールを続行しますか?",1+48 ,APP_TITLE) = 2 Then
   RunUninstall=ERROR_INSTALL_USEREXIT
   Exit Function
  End If

 End If


 '削除実行パスを取得
 Dim strRegPath
 Dim strRun

 strRegPath="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & APP_UNISTALLEID & "\UninstallString"
 strRun=objWshShell.RegRead(strRegPath)


 '空白の場合は、成功を返してExit
 If strRun="" Then
  RunUninstall=ERROR_SUCCESS
  Exit Function
 End If


 'メッセージ
 If Msgbox("OKを押すと、旧バージョンのアンインストールを実行します。", 1+48 ,APP_TITLE) = 2 Then
  RunUninstall=ERROR_INSTALL_USEREXIT
  Exit Function
 End If


 '削除を実行
 Dim objExecCmd

 Err=0
 Set objExecCmd = objWshShell.Exec(strRun)

 If Err.Number = 0 Then

  Do While objExecCmd.Status = 0
   'WScript.Sleep(1000)
  Loop

 End If


 '削除されたかどうか確認
 strRun=""
 strRun=objWshShell.RegRead(strRegPath)

 If strRun="" Then
  'アンインストール以外に必要な処理
  '・
  '・
  '・


  '成功を返す
  RunUninstall=ERROR_SUCCESS
  Exit Function
  
 Else
  Msgbox "旧バージョンのアンインストールをキャンセルしました。" & Chr(13) & "インストールを中断します。", 48 ,APP_TITLE
  RunUninstall=ERROR_INSTALL_USEREXIT
  Exit Function
  
 End if


 '変数解放
 Set objWshShell=Nothing


End Function

'--------------------------------------------------------------

2. インストーラにスクリプトファイルを追加
テーブル「Binary」を開き、コマンド「ADD ROW」で、下記のレコードを追加します。
NameValue
Uninst(ファイル参照ダイアログからセット)
ここでは、任意のファイルをインストーラーに追加します。
"Name=Uninst"は重複しない適当な名前です。
"Value"には、1.で作成したVBSファイルをセットします。

3. カスタムアクションを作成
テーブル「CustomAction」を開き、コマンド「ADD ROW」で、下記のレコードを追加します。
ActionTypeSourceTarget
CA_UNINST2118UninstRunUninstall
ここでは、任意のプログラムを起動する「動作」を追加します。
"Action=CA_UNINST"は重複しない適当な名前で、"TYPE=2118"は"Source"で指定されるBinaryテーブル内のVBScriptファイルを実行し、"Target"で指定される関数(Function)を実行することを表す定数(=6)と、スクリプト上でエラーが発生した場合でも無視して継続することを示す定数(=64)と、VISTA以降のOSで管理者権限でスクリプトを実行することを示す定数(=2048)の合計です。
先に述べたように、インストールしようとするパソコンにおいて、ファイルシステムオブジェクト(scrrun.dll)が正常に動作していない場合や、アンチウイルスソフトによって、スクリプトの動作が妨害されている場合、このアクションは失敗することがあるので注意が必要です。

4. 処理フローを追加
テーブル「InstallUISequence」およびテーブル「InstallExecuteSequence」をそれぞれ開き、コマンド「ADD ROW」で、下記のレコードを追加します。
ActionConditionSequence
CA_UNINSTREMOVE="" AND REINSTALL=""2
InstallUISequenceは、インストール作業を行うための準備の流れを設定するテーブルです。
このテーブルは、ユーザーがサイレントインストールを行った場合などに、処理されないこともありうるので、念のため、テーブル「InstallExecuteSequence」にも同様の処理を記述しておきます。
ここでは、3.で作成したカスタムアクションを実行する処理を追加します。
"Action=CA_UNINST"は、上記3.で追加したカスタムアクションの名前で、"Sequence"の数字は、実行される順番を表します。
また、ここでは、"Condition"として、アンインストール時および修復時には実行しないようにしました。
"Sequence"は、既存の"Action=InstallInitialize(通常1500)"〜"Action=InstallFinalize(通常6600)"の範囲以外で、かつ他のレコードと重複しない数字であれば何でも良いですが、ここでは、できるだけ早い段階で処理をするようにしました。


なお、ここでは、スクリプトの実行タイミングとして、テーブル「InstallUISequence」およびテーブル「InstallExecuteSequence」への処理フローの追加を例にとりましたが、アクションの内容によっては、「インストール完了後にプログラムを実行する方法」で述べたように、テーブル「ControlEvent」を利用する方法もあります。



インストーラ講座の目次へページ最上部へ