エクスプローラにLabVIEWのバージョンを指定してコードを開くメニューを追加する

#はじめに
LabVIEWを複数バージョンで共存させて使っていると、バージョン指定して開きたいと思ったことはありませんか？

LabVIEWの関連付けは最後に起動したLabVIEWのバージョンで書き換わるようになっており、うっかり新しいバージョンでVIを開いて上書きしてしまうと、古いバージョンで開けなくなってしまいます。
　![古いバージョンで開くとこうなる.PNG](https://qiita-image-store.s3.amazonaws.com/0/36514/9dff0912-f09f-222d-4900-60d6783aff09.png)

そこでLabVIEWのバージョンを指定してファイルを開けるようにエクスプローラのメニューに各バージョンで開くメニューを追加する方法を紹介します。

#概要
レジストリのWindowsの関連付けの情報を格納している部分を書き換えることで、右クリックメニューを書き換えます。
今回はLabVIEWのファイルタイプのうち、主要な３つのファイルタイプ(*.vi,*.ctl,*.lvproj)に対してエクスプローラの右クリックメニューに「バージョンを指定して開く」というメニューを追加し、さらにサブメニューでバージョンを選択出来るようにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/c93855bd-741f-84c7-de3d-0a256a1d4e2b.png)

※記事の末尾にVIスニペットを追加しました。内容を理解した上で自己責任にてご利用下さい。

#手順

レジストリエディタを起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/c16b86ae-74a1-bc1b-d212-0cecd654de35.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/26ac1aff-b358-dab2-85b7-b433bd330e71.png)

「HKEY_CLASSES_ROOT」の直下に拡張子が羅列されているので、対象の拡張子のキーを開いて、どのファイルタイプを参照しているか確認します。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/7353b873-540a-2e54-2ab2-89eb493b50f5.png)

調べた結果は以下の通りです。

| 拡張子    | ファイルタイプ |
|:---------|:-------------|
| .vi      | LabVIEWInstrument  |
| .ctl     | LabVIEWControl |
| .lvproj  | LabVIEWProject  |

続いて「HKEY_CLASSES_ROOT」の直下にファイルタイプのキーがあるのでそちらを開きます。

LabVIEWInstrumentを例に見てみると、デフォルトでは
HKEY_CLASSES_ROOT\LabVIEWInstrument\shell　の中に「Open」というキーがあります。
これが「開く」と対応するキーであることが分かります。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/f33b744d-2607-8617-70be-37cbe137ecf7.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/225a2979-d673-46f3-3492-c20154d10853.png)

同じShellの階層に適当な名前でキーを作成します。
「SpecifyVersion」としておきます。
さらに文字列型で値を作成します。内容は下記の通りです。
ExtendedSubCommandsKeyに設定する値はサブメニューの内容の参照先です。(後で定義します。)

| 名前 | 種類 | データ |
|:------------------------|:-------|:------------------------|
|ExtendedSubCommandsKey   | REG_SZ  | LabVIEWSpecifyVersion  |
|MUIVerb                  | REG_SZ  | バージョンを指定して開く  |

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/64ce66d3-5010-0aa1-0319-3a07a61d5920.png)

この時点で右クリックメニューに「バージョンを指定して開く」が追加されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/7a8841d4-f428-4a93-fa63-19a599adefe4.png)

続いてサブメニューの内容を作成します。
「HKEY_CLASSES_ROOT」の直下に先程「ExtendedSubCommandsKey」でに設定したデータと同じ名前でキーを作成します。
今回は「LabVIEWSpecifyVersion」という名前で作成します。

さらにその下の階層に「shell」というキーを作成し、その下の階層に自分の環境にインストールしているLabVIEWのバージョン名でキーを作成します。
各LabVIEWのバージョンの下には「command」というキーを作成しておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/6f75637a-affe-d768-f9d0-7916ae851cb5.png)

HKEY_CLASSES_ROOT\LabVIEWSpecifyVersion\shell\LabVIEW2014 に以下のように値を作成します。

| 名前 | 種類 | データ |  説明 |
|:----------|:-------|:------------------------|:--------------|
|Icon       | REG_SZ  | "C:\Program Files (x86)\National Instruments\LabVIEW 2014\LabVIEW.exe",0 | アイコンを指定します。アイコンが不要な場合は省略可能です。|
|MUIVerb    | REG_SZ  | LabVIEW 2014  | メニューに表示されるラベルを設定します。省略するとキー名が採用されます。 |

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/d583cbd7-505d-b4b3-1ba2-368d0ec0aaf7.png)




最後に実際にメニューを選択された時に実行するコマンドを設定します。

HKEY_CLASSES_ROOT\LabVIEWSpecifyVersion\shell\LabVIEW2014\command に以下のように値を作成します。

| 名前 | 種類 | データ |
|:------------------------|:-------|:------------------------|
|(既定)   | REG_SZ  | "C:\Program Files (x86)\National Instruments\LabVIEW 2014\LabVIEW.exe" "%1"  |

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/1f3c9263-a68f-9ce8-436b-b505ee4ee132.png)


あとは同じ要領で各バージョンに対して値を設定して下さい。
全てのバージョンの設定が出来るとこのようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/c93855bd-741f-84c7-de3d-0a256a1d4e2b.png)

あとはLabVIEWProjectやLabVIEWControlのキーでも同じようにExtendedSubCommandsKeyを作成してLabVIEWSpecifyVersionを参照するようにするだけで他のファイルタイプにもメニューを追加出来ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/1d2dc3e0-c0ce-116d-5168-ccb0e69e7303.png)


#VIスニペット

手動でやるとかなり面倒だったので、LabVIEWから同様のことが出来るようにVIスニペットを作成してみました。
動作は簡単にしか確認していません。コードの内容を理解の上、自己責任でご活用下さい。
※実行時に設定を間違えてもレジストリエディタで手動で直せる人推奨です。

![LabVIEW_SpecifyVersion.png](https://qiita-image-store.s3.amazonaws.com/0/36514/dd482efa-a869-beb5-66c8-841aa0bd394f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/88a8fbbd-802c-08f2-9604-da919734759b.png)
選択されたファイルタイプのshellの下にSpecifyVersionのキーを作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/36514/edae1c8c-89e3-077d-1608-6ca9aec14e2e.png)

サブメニューに「表示名」に入力された項目を追加します。
「表示名」はキーの名前にも使用しているので日本語は使わないで下さい。
選択されたLabVIEWの実行ファイルをアイコンとcommandで呼び出すファイルとして設定します。

※適用範囲を「全ユーザ」にする時はLabVIEWを「管理者として実行」で起動しておく必要があります。


#参考情報

http://msdn.microsoft.com/en-us/library/hh127467(v=vs.85).aspx
http://nonsubject.arinco.org/2011/08/5.html#more
http://io-repo.blogspot.jp/2011/05/cascading-context-menus-via-static.html
http://support.microsoft.com/kb/256986/ja
http://news.mynavi.jp/column/windows/115/
http://keicode.com/windows/associate-app-with-file.php