「レジストリの編集」Subプロシージャ
いよいよ、「コンテキストメニュー・インストーラ」の主要部分です。確認ダイアログを出して、[OK]ボタンが押されれば、インストール(アンインストール)を実行します。

'//================================================================== '//======================================== '// '// レジストリの編集 '// '//======================================== '// 引数 :なし '// 返り値:なし '// 仕様 :レジストリを変更する。 Sub EditReg '//==== 変数の初期化 ============================================ '// Dim WSHShell, fSys, addReg, myPath, myFolder, addPath, strMsg ' WScript.Shellの初期化 Set WSHShell = CreateObject( "WScript.Shell" ) ' FileSystemObjectの初期化 Set fSys = WScript.CreateObject( "Scripting.FileSystemObject" ) ' レジストリのパスを設定 addReg = baseReg & strTitle & "\" '//==== HTMLファイルのパスを作成 ================================ '// myPath = WScript.ScriptFullName myFolder = fSys.GetParentFolderName( myPath ) & "\" addPath = myFolder & addFile '//==== 表示メッセージを作成 ==================================== '// strMsg = vbCrLf & "「" & strTitle & "」を「レジストリ」" If strInstallMode = "インストール" Then strMsg = strMsg & "に「インストール」" Else strMsg = strMsg & "から「アンインストール」" End If strMsg = strMsg & "してよろしいですか?" & vbCrLf '//==== 確認メッセージボックス ================================== '// If MsgBox( strMsg, 1 ) = 1 Then '//==== [OK]の場合([キャンセル]の場合は何もしない) ==== '// If strInstallMode = "インストール" Then '//==== インストールの場合(各項目をレジストリに追加) == '// WSHShell.RegWrite addReg, addPath WSHShell.RegWrite addReg & _ "contexts", intContexts, "REG_DWORD" WSHShell.RegWrite addReg & "flags", intFlags, "REG_DWORD" Else '//==== アンインストールの場合 ========================== '// On Error Resume Next ' 未インストール時のエラー回避 WSHShell.RegDelete addReg End If '//==== 終了メッセージ ====================================== '// strMsg = strInstallMode & "しました" & vbCrLf & vbCrLf strMsg = strMsg & _ "IEを起動している際は、IEを起動しなおしてください" MsgBox strMsg End If End Sub
ここは少し丁寧に解説します。
変数の初期化
まず最初は、WSHShellに関してです。CreateObject( "WScript.Shell" )として初期化されているWSHShellは、レジストリの操作のために必要なオブジェクトになります。なぜならば、レジストリの編集は、WScript.Shellというオブジェクトのメソッドを通して行われるからです。
次はfSysに関してです。CreateObject( "WScript.Shell" )として初期化されるfSysオブジェクトは、ファイル操作のために必要なオブジェクトになります。以降、このオブジェクトを利用して、「source_view.html」のフルパスを作成することになります。
addRegは、レジストリに登録する際の「レジストリのキーのパス」になります。「基準パス baseReg」に「メニューへの表示名 strTitle」を結合することでパスを作成しています。また、末尾に\が追加されていることに注目しておいてください。この末尾の\に関しては、実際にレジストリを編集する段階で詳しく説明します。
HTMLファイルのパスを作成
ここでは、addPathという、レジストリに書き加えるための「source_view.html」のフルパスを作成しています。WScript.ScriptFullNameは「installer.vbs」のフルパスになります。このフルパスから、親フォルダのパスをfSys.GetParentFolderName( myPath )として取り出し、「source_view.html」というHTMLファイル名を結合することで、「source_view.html」のフルパスが完成します。「installer.vbs」と「source_view.html」を同じフォルダに置いているのは、こうやって「source_view.html」のフルパスを作成するためです。
次の「表示メッセージを作成」「確認メッセージボックス」の部分について説明します。
ここでは、本当にインストール(アンインストール)を行ってよいのかどうか、ユーザーに確認を行います。[OK]ボタンが押された場合は、実際のレジストリの編集が行われます。[キャンセル]が選ばれた場合は、そのまま終了します。
インストール時のレジストリの編集
いよいよ山場です。RegWriteというのが、レジストリへの書き込みを行うメソッドです。WSHShell.RegWrite addReg, addPathとすることで、addRegのパスの(標準)に、addPathを書き込みます。このとき注意して欲しいのは、レジストリのパスaddRegは、末尾に\が付いていることです。つまり、Explorerで言うところの「フォルダ」のようなものとして、レジストリに新たなキーを作成していることになります。
次の2行は、書き込み先がaddReg & "contexts"、addReg & "flags"となっています。この2つの書き込み先は、末尾に\が付いていません。この2行では、先ほど作成したaddRegのパスの下に、値を登録することになります。Explorerで言うところの「ファイル」のようなものとして、レジストリに新たな値を作成することになります(ちなみに、この値に入れるデータは、「ファイルの中身」のようなものになります)。
レジストリのcontextsには、「メニューへの表示条件 intContexts」が、flagsには、「ウィンドウの表示フラグ intFlags」が、それぞれ"REG_DWORD"(DWORD値)として登録されます。
アンインストール時のレジストリ編集
On Error Resume Nextという行について説明しておく必要があるでしょう。この命令は、エラーが発生しても処理を継続するというものです。アンインストールではレジストリを削除します。しかし、まだソフトがインストールされていない場合は、削除するパスが存在しないという事態が発生します。そしてその場合、エラーが発生します。このとき、このエラーを無視してそのまま処理を継続させるために、この行は用意されています。
レジストリを削除するのはRegDeleteメソッドです。WSHShell.RegDelete addRegで、addRegのレジストリのパスを削除しています。addRegを削除すれば、その下に作成されたcontextsやflagsの値もまとめて削除されます。
最後に「終了メッセージ」を表示して、レジストリの編集は終わりです。レジストリを書き換えた場合は、起動しているIEをいったん終了して、再度IEを起動しなおす必要があります。そのために、そのことを促すメッセージを表示させています。
このメッセージは、ダイアログとして次のように表示されます。

以上で、「コンテキストメニュー・インストーラ」のコーディングは終了です。
