CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発 雑感

VCランタイムがインストールされているかどうかをチェックする方法

投稿日:

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用のランタイムはリダイレクトされた側にもレジストリが登録されること。へー気が利いているじゃんと思えるが、ランタイムをアンインストールした場合には、リダイレクトされた側のレジストリが消えない。インストール時に登録するんだったら、アンインストール時に消すのが作法。リダイレクト側だけに着目している人にとっては、アンインストール時にキーが消えないというバグに見える。リダイレクト前のレジストリが正しいということに気付けばいいんだけどね。

-ソフト開発, 雑感

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

関連記事

今年一年を振り返ってタラタラと書いてみる

スマホから書いてるんで、とっても書きづらいけど、新幹線乗っててヒマだから、ブログの一本でも書いてみようということ。 バリ島に行けなかった。ファッキンな仕事のせい。いつもの9月はリリース月だからと遠慮し …

代休一日目をどう過ごしたか

4月と5月のおいらの社畜っぷりはすさまじく、休日出勤もあったし夜は平均すると23時過ぎに帰宅の途につく状態で、かろうじてその日のうちに家に着いて酒飲んでねるという日々だった。会社員人生26年になるけど …

PDFファイルを扱うプログラミング用ライブラリ一覧

以下の記事がよく読まれているみたいなので、もっと幅広く「PDFファイルを扱うプログラミング用ライブラリ一覧」という本記事を書いてみる気になった。 iTextSharpのバージョンとライセンスが難しい …

no image

ちょっといい話

Tポイントカードを持つようになった。 会社と自宅の近くにファミリーマートがあって、買い物の度に 「Tポイントカードありますか?ありません。失礼しました」 ってやりとりをするのがわずらわしかったし、 ポ …

no image

経営セーフティ共済とは

妻の会社の節税のために経営セーフティ共済なるものへの加入を検討している。年イチ行事の税理士打ち合わせで提案された。