トップ回答者
UCRTがインストールされているかをチェックする方法について

質問
-
お世話になっております。
C++ランタイムのUniversal CRTがインストールされているかどうかをチェックする方法についてご教示頂きたく投稿させて頂きました。
Visual Studio 2015でビルドされたC++モジュールを、Install Shield(Pro)を使用して作成したexe形式のインストーラで配置しています。
C++ランタイムのマージモジュールにUCRTが入っていない事を受け、インストーラの実行時にUCRTがインストールされているかをチェックし、インストールされていなければエラーにしたいと考えています。
OS(Windows 7以降のクライアント/サーバーOS)や、UCRTのインストール方法(VCRedist.exe/Windows Update等)に寄らず共通にチェックを掛けられるレジストリ値などはあるのでしょうか。
回答
-
ucrtbase.dll が LoadLibrary 関数でロードできるかどうかで、判定を行うのはどうでしょうか?
HMODULE hModule = LoadLibrary(TEXT("ucrtbase.dll")); if (hModule) { MessageBox(hWnd, TEXT("Universal CRT はインストールされています。"), TEXT("確認"), 0); FreeLibrary(hModule); }
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月6日 1:31
- 回答としてマーク yama_h 2017年3月7日 5:25
すべての返信
-
ucrtbase.dll が LoadLibrary 関数でロードできるかどうかで、判定を行うのはどうでしょうか?
HMODULE hModule = LoadLibrary(TEXT("ucrtbase.dll")); if (hModule) { MessageBox(hWnd, TEXT("Universal CRT はインストールされています。"), TEXT("確認"), 0); FreeLibrary(hModule); }
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月6日 1:31
- 回答としてマーク yama_h 2017年3月7日 5:25
-
ご返信ありがとうございます。
プログラムを書かないで厳密に確認するのは難しいのではと思っています。
アップデートパッチの確認について、とちゃんさんが挙げられている KB2999226 以外にも、KB3118401 が当たっている場合も Universal CRT がインストールされます。将来的には別の KB でも Universal CRT がインストールされるかもしれません。また、Visual Studio がインストールされている環境では KB が 当たっていなくても Universal CRT がインストールされていることもあるようです。
Universal CRT がインストールされている環境では、下記のレジストリパスが存在するようですので、レジストリをパスを確認する方法でもよいかもしれません。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\
に
- x86_microsoft-windows-ucrt_31bf3856ad364e35
- amd64_microsoft-windows-ucrt_31bf3856ad364e35
- wow64_microsoft-windows-ucrt_31bf3856ad364e35
から始まるレジストリパスが存在するかどうか、またレジストリパスが存在していた場合に、そのレジストリパスの(既定)に値が入っているかどうか上記の確認を行うプログラムを作成してみました。
https://github.com/kenjinote/IsUniversalCRTInstalled/blob/master/Source.cpp
参考になりましたら幸いです。
- 編集済み kenjinoteMVP 2017年3月4日 13:22
-
>とっちゃん様、kenjinote様
返信ありがとうございます。
レジストリ情報ちを調べて組み込んでみましたが、kenjinote様の仰ったようにKB3118401のみインストールされている端末で上手くいきませんでした。
>佐裕理様
当初はインストーラーに再配布用のexeを組み込もうかとも思っていたのですが、
Windows Updateで入るというのがメインとなると、インストール方法は利用ユーザーに任せた方が良いかなと思いチェックのみとしていました。
プログラムを組み事や、再配布用のexeを組み込む事はNGではないので、まずは一通り試してみようと思います。
-
vc_redist が使えるのであれば、それを使う方が面倒が少ないと思います。
とはいえ、VCの再配布モジュールがインストール済みかどうかをチェックする仕組みは必要なので、その部分は設定が必要です。
こちらは、InstallShield特有ですが、VS2015の最新のものとInstallShieldの管轄下にあるものが必ずしも同じとは限らない点に注意が必要です。
マージモジュールは、既定のフォルダがあるため、そこを更新することで最新版を維持できるのですが、事前インストールコンポーネントは、IS独自の管理のはずなので、最新版と必ずしも一致しているとは限りません。
現行のISでどのように管理しているのかわからないので、このあたりはマニュアル等で確認してください。
vc_redist の最新版は、VS2015の最新版をインストールした環境の
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\1033 (x64環境でデフォルトのインストール先の場合)
にあります。
とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx