経歴

 自作ソフトを作った場合、インストーラーがほしくなります。ただしVisual C++ 2008 Expressには付属しておりません。
調べてみるとMicrosoftよりフリーのWixというソフトが発表されていました。これはxml形式のファイルよりWindows Insta;;er 用のmsi形式のファイルを作成できます。ためしに使ってみました。

Wix3のインストール

http://sourceforge.net/projects/wix/files/ より
WiX v3.0 (stable)をクリックして、次に3.0.5419.0 RTMをクリックします。
wix3.0.5419.0-x86-setup.zip wix3.0.5419.0-sources.zip をダウンロードします。
wix3.0.5419.0-x86-setup.zip を解凍しmsiファイルをダブルクリックしてwix3をインストールします。
wix3.0.5419.0-sources.zipを解凍しその中からext\UIExtension\wixlibの中のWixUI_ja-jp.wxl(日本語の表示にするために必要)をC:\Program Files\Windows Installer XML v3\binにコピーします。メッセージを日本語で表示するのに必要となります。

インストーラのサンプル

1個のファイルをインストールするインストーラーの作成(Wix3)
1個のファイルをインストールするインストーラーの作成(Wix3) 64bitアプリ
2個のファイルをインストールするインストーラーの作成(Wix3)
2個のファイルをインストールするインストーラーの作成(Wix3) フォルダ作成
2個のファイルをインストールするインストーラーの作成(Wix3) 2階層のフォルダ作成
1個のファイルをインストールするインストーラーの作成(Wix3) Visual C++ 2008再配布パッケージを含む

標準的なインストーラーの作成

下図のようなインストーラーを作ってみました。

仕様は、下記のとおりとする。
著作権表示ができる。
インストールフォルダを変更できる。
Visual C++ 2008 Expressで作成された実行ファイル(MFC等を使用しないAPIレベル)を対象としラインタイムファイルをインストールできる。
アンインストールがコントロールパネルより実行できる。
ショットカットの作成ができる。

フォルダー構成

下記のようにファイルを配置します。

mysoft.exe ←インストールするソフト
License.rtf
setup.wxs

ソースコード(setup.wxs)

メモ帳等に下記のソースをコピーします。

<?xml version="1.0" encoding="UTF-8"?>

<!--  インストーラー (Visual C++ 2008 Express用)
      インストールフォルダーの変更・ショートカットの登録・アンインストール情報の設定
      ランタイムパッケージの登録(Visual C++ 2008用)
      をサポート
-->

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
 
  <!--  UpgradeCode:アップグレー時に必要なcode(guidegen.exe等で作成)
        Version:インストールするアプリケーションのバージョン
        Language:1041   日本語
        CodePage:932    日本  
        Name:*.msiファイルの表題やコントロールパネルのアプリケーションの削除等に表示される名前
        Manufacturer:*.msiファイルの作成者に表示される名前
        EmbedCab:yseにすると*.msiファイルにインストールすべき全ファイルが結合される
                 noにすると*.msiファイルとCabinetで指定されるcabファイルが作成される
  -->
  
    <Product Id="*" UpgradeCode="xxxxxxx" Version="1.0.0.0"
             Language="1041" Codepage="932 " Name="ソフト名" Manufacturer="作成者">
        <Package InstallerVersion="300" Languages="1041" SummaryCodepage="932" Compressed="yes"/>
        <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
<!--    Name:program filesの下のフォルダー名を指定 -->
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="インストールフォルダ"/>
            </Directory>
<!--    Name:スタートメニュー プログラム下のフォルダー名を指定-->
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="メニューフォルダ"/>
            </Directory>

<!--    マージモジュール  実行に必要なランタイムファイルを指定 -->
          <Directory Id="SystemFolder" SourceName="System" LongSource="System32">
            <Merge Id="VC90CRTx86.msm" Language="0" DiskId="1"
              SourceFile="$(env.CommonProgramFiles)\Merge Modules\Microsoft_VC90_CRT_x86.msm"/>
          </Directory>

        </Directory>

      <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<!--    Guid:アンインストール用時に使われるGUID値(guidgen.exe等で作成)  -->
          <Component Id="mysoft.exe" Guid="yyyyyy">
<!--    Source:コピー元のファイル名 ほかに必要なファイルがあれば<File Id=  />を繰り返す  -->
              <File Id="mysoft.exe" Source="mysoft.exe" KeyPath="yes" Checksum="yes"/>
          </Component>
      </DirectoryRef>

      <DirectoryRef Id="ApplicationProgramsFolder">
<!--    Guid:アンインストール用時に使われるGUID値(guidgen.exe等で作成)  -->
<!--    Name:ショートカット名  Description:ショートカットのコメント -->
          <!--    Target:ショートカットにする元のファイル名 -->
          <Component Id="ApplicationShortcut" Guid="zzzzzz">
                <Shortcut Id="ApplicationStartMenuShortcut"
                Name="ショートカット名"
                Description="ショートカットコメント名"
                Target="[APPLICATIONROOTDIRECTORY]mysoft.exe"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
<!--    アンインストールに必要なレジストリ登録 makerに作者名 softnameにソフト名 -->
                 <RegistryValue Root="HKCU" Key="Software\maker\softname" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
           </Component>
        </DirectoryRef>

        <Feature Id="MainApplication" Title="Main Application" Level="1">
          <ComponentRef Id="mysoft.exe" />
            <ComponentRef Id="ApplicationShortcut" />
            <MergeRef Id="VC90CRTx86.msm"/>

        </Feature>
      <!-- 変更:InstallDir UI-->
<!--   インストールフォルダーを変更できるようにする 上記のDirectory IdとValueと同じ名前でなければならない-->
      <UIRef Id="WixUI_InstallDir" />
      <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<!--    ライセンス条項の内容を定義  -->
      <WixVariable Id="WixUILicenseRtf" Value="LICENSE.rtf"/>
      <!-- 変更:InstallDir UI-->
    </Product>
</Wix>

GUID値を設定

上記ソースコード中の xxxxxx , yyyyyy , zzzzzz に世界で唯一であるユニークな値を設定します。この値は、guidgen.exeで作成できます。
guidgen.exeはVisual C++ 2008がインストールされているとC:\Program Files\Microsoft Visual Studio 9.0\Common7\Toolsにあります。
一度、program files内でguidgen.exeを検索してみてください。
なければ、googleなどでguidgen.exeを検索してみてください。microsoftのサイト内にあるようです。FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFFのような並びの値が作成されます。

ソフト名等の設定

上記ソースからmsiファイルを作成するとプロパティとスタートメニューは下図のようになります。

変更するには、下表の色つきのところをメモ帳などで置き換えれば任意にできます。

内容 上記ソースコード
登録するアプリケーションファイル(ショートカットのターゲットファイル) mysoft.exe
表題 ソフト名
作成者 作成者
program files内に作成されるフォルダー名 インストールフォルダ
スタートメニュー プログラムの中に作成するフォルダー名(all userに作成される) メニューフォルダ
ショートカット名 ショートカット名
ショートカットのコメント ショートカットコメント名
レジストリに登録する作成者 maker
レジストリに登録するソフト名 softname

複数のファイルをインストールする場合は、
<File Id="mysoft.exe" Source="mysoft.exe" KeyPath="yes" Checksum="yes"/>
<File Id="mysoft2.exe" Source="mysoft2.exe" KeyPath="yes" Checksum="yes"/>
のように<File Id を繰り返します。

ソースファイルの保存

setup.wxs という名前で保存します。(setup.wxs.txt ではありません)

msiファイルに変換

コマンドラインベースのcandle.exe , light.exeを使います。この2つのファイルは、C:\Program Files\Windows Installer XML v3\binにあります。
スタートメニューでコマンドプロンプトを実行してもこれらへのパスが通っていないのでフルパスで指定しなければならないので面倒です。
下記のようなバッチファイルをソースファイルと同じフォルダーに作成しておくと、エクスプローラー上からバッチファイルをダブりクリックすることによりパスの登録及びコマンドプロンプトをソースファイルのフォルダーをカレントにして実行できます。下記の場合d:\setupの中にソースファイルを置いております。

PATH=%ProgramFiles%\Windows Installer XML v3\bin;%path%
cmd

上記のソースをメモ帳にコピーし setwix.bat という名前でd:\setup内に保存します。
エクスプローラでsetwix.batをダブルクリックします。

msiファイルの変換はコマンドプロンプトで下記のように入力します。

candle setup.wxs
light -ext WixUIExtension -loc "C:\Program Files\Windows Installer XML v3\bin\WixUI_ja-jp.wxl" setup.wixobj

上記のように毎回入力するのが煩雑ですのでこれもバッチファイルを作っておくとよいでしょう。サンプルを下記に示します。c:\はwixのインストール先にあわせて変更してください。

candle %1.wxs
if errorlevel 1 goto end
light -ext WixUIExtension -loc "c:\Program Files\Windows Installer XML v3\bin\WixUI_ja-jp.wxl" 
%1.wixobj
:end

バッチファイル名をw.batとすると実行は、 wix setup と入力します。

ちなみにたくさんエラーが出ると思いますが、microsoft公認です。

http://cml.s10.xrea.com/ej/WiX/install_vcredist.htm

日本語化する

上記のlight実行時に -loc "c:\Program Files\Windows Installer XML v3\bin\WixUI_ja-jp.wxl" を指定しないと、下図のように英語のメッセージになってしまいます。意外とweb上に情報がなかったので記載しております。ダイアログボックスのメッセージはこのファイルを修正すると変更できます。

標準の画像を変更する

下図の用に自分の用意した画像を変更できます。

最初と最後のページの変更

</Product の行の上に下記の行を追加します。welcome.bmp が画像ファイルで493*312ピクセルのサイズとします。この画像はダイアログボックスのほぼ全体を占めます。中央から右に掛けてメッセージが表示されますので、背景を白等明るくする必要があります。ちなみに小さいサイズの画面を用意すると自動的に拡大されます。この例ではお城の横幅を170ピクセルにしています。

<WixVariable Id="WixUIDialogBmp" Value="welcome.bmp" />

途中の画像の変更(上部バーナー)

</Product の行の上に下記の行を追加します。Banner.bmp が画像ファイルで493*58ピクセルのサイズとします。この画像はダイアログボックスのほぼ横幅全体を占めます。左側から中央に掛けてメッセージが黒字で表示されますので、背景を白等明るくする必要があります。ちなみに小さいサイズの画面を用意すると自動的に拡大されます。この例ではお城の横幅を約60ピクセルにしています。

<WixVariable Id="WixUIBannerBmp" Value="Banner.bmp" />

 

前のページに戻る