none
UCRTがインストールされているかをチェックする方法について RRS feed

  • 質問

  • お世話になっております。

    C++ランタイムのUniversal CRTがインストールされているかどうかをチェックする方法についてご教示頂きたく投稿させて頂きました。

    Visual Studio 2015でビルドされたC++モジュールを、Install Shield(Pro)を使用して作成したexe形式のインストーラで配置しています。

    C++ランタイムのマージモジュールにUCRTが入っていない事を受け、インストーラの実行時にUCRTがインストールされているかをチェックし、インストールされていなければエラーにしたいと考えています。

    OS(Windows 7以降のクライアント/サーバーOS)や、UCRTのインストール方法(VCRedist.exe/Windows Update等)に寄らず共通にチェックを掛けられるレジストリ値などはあるのでしょうか。

    2017年3月3日 1:56

回答

  • ucrtbase.dll が LoadLibrary 関数でロードできるかどうかで、判定を行うのはどうでしょうか?

    HMODULE hModule = LoadLibrary(TEXT("ucrtbase.dll"));
    if (hModule)
    {
    	MessageBox(hWnd, TEXT("Universal CRT はインストールされています。"), TEXT("確認"), 0);
    	FreeLibrary(hModule);
    }
    

    2017年3月3日 2:46

すべての返信

  • ucrtbase.dll が LoadLibrary 関数でロードできるかどうかで、判定を行うのはどうでしょうか?

    HMODULE hModule = LoadLibrary(TEXT("ucrtbase.dll"));
    if (hModule)
    {
    	MessageBox(hWnd, TEXT("Universal CRT はインストールされています。"), TEXT("確認"), 0);
    	FreeLibrary(hModule);
    }
    

    2017年3月3日 2:46
  • Universal CRT は、KB2999226 で Windows Update から配信(または、下記リンクのMSUでローカルインストール)されています。

    UCRTのインストールチェックをしたいのであれば、前述のKBのインストール状態をチェックすれば判定できると思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年3月3日 2:57
  • kenjinote様

    返信ありがとうございます。

    確かにdllがロードできるかどうかであればバージョン等にも依存せずにいけそうですね。

    極力プログラムを書かないという方針のため、アップデートパッチを確認する方法が上手く行かない時にご教示頂いた方法を組み込んでみます。

    2017年3月3日 8:11
  • ご返信ありがとうございます。

    プログラムを書かないで厳密に確認するのは難しいのではと思っています。

    アップデートパッチの確認について、とちゃんさんが挙げられている 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

    参考になりましたら幸いです。

    2017年3月3日 9:27
  • 別にチェックせずインストールしてしまうのではいけないのでしょうか? UCRTインストーラー自身がインストール済みかどうか判断してくれると思います。
    2017年3月3日 9:33
  • >とっちゃん様、kenjinote様

    返信ありがとうございます。

    レジストリ情報ちを調べて組み込んでみましたが、kenjinote様の仰ったようにKB3118401のみインストールされている端末で上手くいきませんでした。

    >佐裕理様

    当初はインストーラーに再配布用のexeを組み込もうかとも思っていたのですが、

    Windows Updateで入るというのがメインとなると、インストール方法は利用ユーザーに任せた方が良いかなと思いチェックのみとしていました。

    プログラムを組み事や、再配布用のexeを組み込む事はNGではないので、まずは一通り試してみようと思います。

    2017年3月3日 10:14
  • 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

    2017年3月6日 1:09
  • お世話になっております。

    皆様にご教示頂いた方法を一通り試していたため、返信が遅れてしまいました。

    最終的にはLoadLibraryを行うプログラムを作成し、インストーラに組み込む事に致しました。

    インストーラ側が少々複雑になってしまいましたが、探す方法としては影響を受けにくいかと思いそのようにしました。

    誠にありがとうございました。

    2017年3月7日 5:25