VCランタイムとは、プログラム一覧でこんな名前のものを言う。
Microsoft Visual C++ 2015-2022 Redistributable (x64) – 14.40.33810
VC++で組んだプログラム(共有DLLでMFCを使う)を動作させるのに必要。
マイクロソフトのサイトから、X64用のバイナリを指定すれあばVC_redist.x64.exeが入手できる。
正式名称は、Microsoft Visual C++ 再頒布可能パッケージ。
(x86用のモノもあるが、イマドキ32bitアプリもないよなってことで序盤の説明からは除外する。)
まずは結論から書く。
このVCランタイムがインストールされているかどうかをチェックするには、レジストリをチェックすればよい。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
以下すべてDWORD値で、インストール済みの状態。
Installed=1
Major=14
Minor=40
Bld=33810
VCランタイムがアンインストールされると、キーx64配下が消える。ただし、VisualStudioがインストールされた環境では消えないというややメンドウな動きになるが、アプリ開発者にとって開発環境での動作はそれほど重要ではないので消えるという結論でよいだろう。
気を付けなければいけないのは、HKEY_LOCAL_MACHINE\SOFTWAREがリダイレクトされる場合があること。
64bitOSで32bitアプリからレジストリ確認した場合に、WOW6432Nodeという場所に飛ばされるという罠。
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
普通にx64用のプログラムからレジストリチェックしていればこの罠にははまらないが、いやいや意識せずに32bitアプリを使っていることがあって、その代表がInstallShieldのスクリプトからチェックしている場合。VCランタイムをインストールするのはインストーラというのが相場が決まっており、IstallShieldで作ったインストーラが32bitというのがよくある。最新のIstallShieldのことは知らんが、おいらが使っている2012はまちがいなく32bitアプリとして動作している。
勝手にリダイレクトされないための処理はこんな感じ。
InstallShieldのスクリプトの場合。事前処理と事後処理あり。
if ( bX64 ) then Disable( SELFREGISTERBATCH ); REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY; endif; // ここでレジストリチェック if ( bX64 ) then Enable( SELFREGISTERBATCH ); REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; endif;
32bitアプリの場合。キーを開くときにKEY_WOW64_64KEYを指定するのがポイント。
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey, 0, KEY_READ|KEY_WOW64_64KEY, &hKey) != ERROR_SUCCESS) return FALSE;
最後に、32ビット用のラインタイムについても触れておく。
Microsoft Visual C++ 2015-2022 Redistributable (x86) – 14.40.33810
VC_redist.x86.exe
32bitアプリを動かすためのランタイムなので、レジストリは32bit用になる。
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
このあたりのレジストリを見ていると、以下のキーがあることもわかる。
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
これが第2の罠で、64bit用のランタイムはリダイレクトされた側にもレジストリが登録されること。へー気が利いているじゃんと思えるが、ランタイムをアンインストールした場合には、リダイレクトされた側のレジストリが消えない。インストール時に登録するんだったら、アンインストール時に消すのが作法。リダイレクト側だけに着目している人にとっては、アンインストール時にキーが消えないというバグに見える。リダイレクト前のレジストリが正しいということに気付けばいいんだけどね。