Help us understand the problem. What is going on with this article?

Windows Installer手引書 Part.10 VCで作ったアプリとマージモジュール

前の記事へ  目次へ  次の記事へ

マージモジュールとは

マージモジュールとは、MSIファイルと結合できるインストーラーの一部を切り離した、ライブラリのようなものです。マージモジュールはインストーラー作成時にMSIと結合するもので、結合後はどの部分がマージモジュールに含まれていたものか、MSIファイルを見ても区別がつかなくなります1。そのため、ユーザーにはインストーラーにどのようなマージモジュールをマージしたか知ることはできません。

マージモジュールの使いどころ

今回は、Visual C++のランタイムライブラリのインストールについて書いていきます。実は、これ以外の用途でマージモジュールを使ったことがありません2

従来からあるWin32 APIを使ったプログラミングでは、ほとんどの場合Visual C++が使われるのではないでしょうか。そして、Visual C++で開発されたほとんどのプログラムが、実行時にVCランタイムライブラリを必要とします3

VCランタイムのマージモジュール

マージモジュールのファイル拡張子は.msmです。マージモジュールは、インストールするプログラムを開発する開発機から取得します。例えば私の開発機にはVisual Studio 2017が入っていますが、拡張子*.msmで検索すると、下記のフォルダにありました。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\MergeModules

ここにはいくつかファイルがありますが、どのファイルをマージすべきかは実装担当者が決めることです。プログラムが必要としているライブラリが何かを知っているのは、実装担当者なのですから。Win32 APIを使った一般的なプログラミムでは、たいていファイル名にCRTが含まれたマージモジュールを入れることになると思います。また、昔のVCでは、マージモジュール間で依存関係があり、複数のマージモジュールが必要になるケース4もありました。

このほかに、マイクロソフトのサイトからダウンロードできる再配布可能モジュールというものもあり、拡張子が.EXEの実行形式のプログラムとして提供されています。これをMSI形式のインストーラーから直接呼び出すと、カスタムアクションが必要になるのと、UIに工夫が必要となる5ので、あまりお勧めしません。

VC14ランタイムライブラリは注意が必要

Windows7やWindows8の場合、VC14ランタイムライブラリは依存関係にあるライブラリ(Universal CRTというもの)が、Windows Updateで配布されています。Windows Updateは、よく不具合を起こしていて、PCに不慣れなユーザーはそれもよくわかっていない場合があります。こういう環境でVC14ランタイムライブラリを必要とするアプリを起動すると、必要なDLLが足りない、というエラーダイアログが出てしまうことがあります。そこでよく採られる手段は、アプリのインストール先にUniversal CRTのDLLも一緒にインストールしてしまう方法(詳細はこちらのページの「Visual C++ 2015 での CRT ローカル配置について」を参照)です。Windows Update用のファイルをインストーラーに同梱する手も考えられますが、インストール時間もそれなりにかかるのと、UIを整える手間を考えると、ファイル単位で同梱したほうが簡単です。2020年1月にはWindows7のサポートも切れることですし、サポートの手間を惜しまないのであれば、Universal CRTをアプリに同梱しないのも手です。Windows10であれば、Universal CRTは最初からOSに同梱されています。

再配布可能VC14ランタイムライブラリの中身を見る

最近のVCランタイムライブラリはWiX Toolsetを使って.EXE形式にしてある6ので、WiX Toolset付属のツールでバラすことができます。例えばこんな感じでコマンドを実行すると、expandディレクトリに中身が展開されます。

"C:\Program Files (x86)\WiX Toolset v3.11\bin\dark.exe" vcredist_x86.exe -o expand

以下に展開したファイルの一部を示します。
vcredist_expanded.png
ここにある拡張子がMSIのファイルがVC14ランタイムインストーラーの本体。拡張子が.msuのファイルはWindows Updateで配布されるファイルと同等のものです。再配布可能VC14ランタイムライブラリは、確実にライブラリが機能するように、Windows Update用のファイルを同梱していることがわかります。

前の記事へ  目次へ  次の記事へ


  1. とはいえ、VCランタイムのようにいろいろな製品に汎用的に使われるマージモジュールは、各項目のIDが他とかぶらない様に長い名前がついていて、区別は容易です。 

  2. 便利だったり有用な使い道があったら教えてほしいです。 

  3. Visual C++の開発環境で、VCランタイムを必要としないプログラムの開発もできます。 

  4. 例えば、Microsoft_VC80_CRT_x86.msmはpolicy_8_0_Microsoft_VC80_CRT_x86.msmに依存しているので、両方インストールする必要があります。 

  5. これをWindows Installerで呼ぼうと考えると、カスタムアクションを使用したり、UIと整えたり、結構面倒です。また、再配布可能ライブラリは、”vcredist_x86.exe /?”のようにオプションを付けて実行すると、コマンドラインオプションの一覧が表示されます。UIを最小限にしたり、UIを表示しないコマンドラインオプションがあることがわかります。 

  6. WiX Toolsetの世界ではBundleと呼ばれる。 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away