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
  • お世話なります。

    解決済みとなっていますが、どのように解決されたのでしょうか。

    サポートファイルとなるDLL内にLoadLibrary関数を使用したチェックを関数を実装して
    インストーラにDLLを組み込み、スクリプトから呼んでいるのか。
    もしこの方法を行った場合、DLLは、VC++2015で開発したものなのでしょうか。

    または、UseDLL関数をスクリプトファイルから呼んで判断しているのか。

    教えていただきたいです。

    2022年4月15日 1:32
  • 何を実現したいのでしょうか?

    VC++ランタイムをインストールしたいのなら、vcredist_x86(あるいはx64) をアプリのインストール時に事前コンポーネントとしてインストールするようにInstallShieldで設定すればよいと思います。

    この事例はちょっと特殊なパターンだと思いますよ。


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

    2022年4月15日 2:30
  • 既存のインストーラ(VC++2008MFCアプリケーション)がマージモジュールを使用しており、それをもとに、
    VC++2019のMFCアプリケーションのインストーラを作成、マージモジュールのみを差し替えて作成したので、
    vcredist_x86を使用することは考えておりませんでした。
    UCRTが無い場合、インストール停止するようにと思っていました。

    また、vcredist_x86を実行する場合の条件の作成がわからないということもありました。
    条件の作成がわからないというよりは、条件の内容をどうすればよいのかがわからないというのもあります。

    2022年4月15日 3:33
  • >事前コンポーネントとしてインストールするようにInstallShieldで設定すればよいと思います。

    事前コンポーネントとして実装することにしました。
    開発環境には、14.29.30133\vc_redist.x86.exeがあり、これを利用していますが、

    バージョンまでチェックする必要がありますか?

    2022年4月15日 6:29
  • 内容的には別件ですね。

    一度こちら(Visual C++ ファイルの再配布)をご一読しておくとよいのではないかと思います。

    VS2019世代ではマージモジュールでのインストールは非推奨とされており(従来同様利用可能だがお勧めしないという形)、ランタイムを配布するなら、vcredist_x86.exe などを利用することを勧めています。

    インストーラによって設定方法などが異なりますので、ご自身の状況に合わせて別途質問すると具体的なアドバイス等がもらえるのではないかと思います。


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

    2022年4月15日 6:45
  • >事前コンポーネントとしてインストールするようにInstallShieldで設定すればよいと思います。

    事前コンポーネントとして実装することにしました。
    開発環境には、14.29.30133\vc_redist.x86.exeがあり、これを利用していますが、

    バージョンまでチェックする必要がありますか?

    こっち、気づいてませんでした。

    少なくとも自分の必要とするバージョンより小さいものがインストールされている場合は更新の必要があるのでバージョンチェックは必要です。

    逆に更新の必要がない場合でも実行してしまって問題ないかは、InstallShield の動作仕様にも依存するため、どうなるかは検証してみないとわかりません(私は持っていないので検証できない)。


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

    • 回答の候補に設定 Brillia 2022年4月18日 0:12
    2022年4月16日 3:19