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」で、下記のレコードを追加します。
Name | Value |
Uninst | (ファイル参照ダイアログからセット) |
ここでは、任意のファイルをインストーラーに追加します。
"Name=Uninst"は重複しない適当な名前です。
"Value"には、1.で作成したVBSファイルをセットします。
|
|
3. |
カスタムアクションを作成
テーブル「CustomAction」を開き、コマンド「ADD ROW」で、下記のレコードを追加します。
Action | Type | Source | Target |
CA_UNINST | 2118 | Uninst | RunUninstall |
ここでは、任意のプログラムを起動する「動作」を追加します。
"Action=CA_UNINST"は重複しない適当な名前で、"TYPE=2118"は"Source"で指定されるBinaryテーブル内のVBScriptファイルを実行し、"Target"で指定される関数(Function)を実行することを表す定数(=6)と、スクリプト上でエラーが発生した場合でも無視して継続することを示す定数(=64)と、VISTA以降のOSで管理者権限でスクリプトを実行することを示す定数(=2048)の合計です。
先に述べたように、インストールしようとするパソコンにおいて、ファイルシステムオブジェクト(scrrun.dll)が正常に動作していない場合や、アンチウイルスソフトによって、スクリプトの動作が妨害されている場合、このアクションは失敗することがあるので注意が必要です。
|
|
4. |
処理フローを追加
テーブル「InstallUISequence」およびテーブル「InstallExecuteSequence」をそれぞれ開き、コマンド「ADD ROW」で、下記のレコードを追加します。
InstallUISequenceは、インストール作業を行うための準備の流れを設定するテーブルです。
このテーブルは、ユーザーがサイレントインストールを行った場合などに、処理されないこともありうるので、念のため、テーブル「InstallExecuteSequence」にも同様の処理を記述しておきます。
ここでは、3.で作成したカスタムアクションを実行する処理を追加します。
"Action=CA_UNINST"は、上記3.で追加したカスタムアクションの名前で、"Sequence"の数字は、実行される順番を表します。
また、ここでは、"Condition"として、アンインストール時および修復時には実行しないようにしました。
"Sequence"は、既存の"Action=InstallInitialize(通常1500)"〜"Action=InstallFinalize(通常6600)"の範囲以外で、かつ他のレコードと重複しない数字であれば何でも良いですが、ここでは、できるだけ早い段階で処理をするようにしました。
|
|