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

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

いたちごっこ1

ソフト開発者とクラッカー。その果てしない戦いの日々をここに記します。現在進行形のその戦いに終止符を打つべく、努力を重ねている今、臨場感をもって伝えられれば、と思います。 その前に、「いたちごっこ」とい …

言い回しや漢字の読みを間違って覚えているとはずかしいけど、誰しもそういうのあるんだよね

友人が書いた文章に「春のこぼれ日に誘われた。。」というのがあったので、こもれ日(木漏れ日)だよねーって指定しておいた。 これ、よく調べたら奥が深かった。こぼれ日(零れ日)という表現があって、雲間などか …

特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムをつくるには(2)

以下記事の続編であり、完成形のソースコードを公開。 特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムをつくるには(1) 特定サーバーにアクセスするためのIDを取得するための実 …

残業時間抑制のための午後出社www

もう5月も終わるのか。今日は残業時間を抑え込むために午後出社。14時に出社する予定。先月と今月は大いに社畜になっていて、フィジカルもメンタルもかなりやられ気味。こうやって朝をのんびりと過ごせて、久しぶ …

no image

キャッシュカード

いつものように、近所の銀行のATMでお金を下ろそうとしたある日のことです。 引き出しを選択して、カードを入れて、暗証番号入れて、金額入れて... 普通ならこれで操作は終わりのはずなのに、次の画面は、 …