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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

PDFiumでPDFを描画してみたけど、こんなに簡単にできちゃっていいのかよ!

PDFiumで画像化とテキスト抽出が容易にできることは前回まででわかっていたので、今回は描画に取り組んでみた。

週報 2024/4/7~4/13:巣立つ若者、高校で先生になる、SE3への進化

我がCAD開発チームから人が去る。おいらはいったい何人を見送っただろうか。。ざっと30人くらいなのかな。残る開発メンバーはおいらともう1名の2名だけであり、そこにほんのちょっとだけ関わる2名の作業量を …

no image

遠近両用の老眼鏡を買おうと決意した

老眼が進んで、老眼鏡を手元に置くようになってしばらく経つ。家用、通勤用、会社用の3本があり、価格は100円・2000円・5000円と多様である。この価格差による性能差はよくわからん。デザイン製の違いが …

no image

Tech Ed

Windowsアプリつくって十数年経つけど、Tech Edに初めて行った。 アホらしそうだから毎年敬遠してきたけど、 行ってみたらそれなりにおもしろかった。 携帯で撮った写真。     Tech Ed …

WinMegeのフィルタについて今すぐ知りたいならココを読め

WinMergeでフォルダやファイルを比較して差分を把握することは、プログラムに関わっていれば日常あること。効率よく比較したいならフィルタを使うべし。