.msi の入れ子
Windows Installer の、使用を避ける事が望まれているフィーチャー。一応、リンク。( 参照 参照 )


.NET Framework (3.5/4.0) Client Profile
.NET Framework セットアップのウェブ ブートストラップ プログラム。サブセットなので、 分からない人は使用を避けた方が良いでしょう。開発環境もこちらではダメ。( 参照 参照 参照 )


64ビットOS
Windows Installer on 64-bit Operating Systems ( 英語 )


CDATA
XML のエスケープ シーケンス。  <![CDATA[   から   ]]>  までがセット。大なり、小なりをタグと区別させて使う為に必須。 MSDN


Condition
必要条件。式の評価(真か偽、TRUEかFALSE)が TRUE になる時にだけ 実行される。さもなければ、 アクションをスキップする。( 参照 )


-cultures:ja-jp
WiX ソース ZIP 内に WixUI_ja-jp.wxl が入っています。
( wix2-sources.zip / src ¥ ui ¥ wixui ¥ wixui_ja-jp.wxl )
( wix3-sources.zip / src ¥ ext ¥ UIExtension ¥ wixlib ¥ WixUI_ja-jp.wxl )
WiX 3 の WixUI_ja-jp.wxl 205行目が「完全」のはずが「完了」になっています。使う前に変更して 置いて下さい。ファイルはUTF-8Y(BOMあり)かと思います。Windows のメモ帳での UTF-8 です。
現在は、「 WiX チュートリアル(日本語訳) 」で、WixUI_Alt_ja-jp.wxl が配布されています。


GUID
(理論上)地球上で唯一の番号。Globally Unique IDentifier。 UUID のマイクロソフト使用法。
変更しては動作上困る GUID 、使用していて変更しなくてはいけない GUID といった 区別が重要です。 気を付けましょう。意味が分からずに 「コピー&ペースト」は厳禁です。
(番号と対象物を、各種身分証明書と特定人物の時のように一対一で特定しますので、 意味を分からずに「コピーと貼り付け」を行う事は のちに問題を起こします。やめて下さい。)

通常は Windows SDK に入っているツールを使うと思いますが、 GUID生成 小物プログラム MyGUID( 要 .NET Framework CLR 2.0 ランタイム、 MSDN サンプルのプログラム実行形式 )や WixEdit 内でも GUID を生成できます。 VBスクリプト でも簡単に生成できます。
OSSP uuid などに UUID 生成ソースコードがあるようです。その英語の マニュアル も探せばあるようです。
globally unique identifier (GUID)
Microsoftプロトコル技術文書 (TD) 中で universally unique identifier (UUID) と区別なく使用される用語。 これらの用語の使用法を置き替えることは、値を生成するために 特定のアルゴリズムまたはメカニズムを暗示したり必要としません。 特に、この用語の使用は、GUID を生成するために [RFC4122] または [C706] において指定されたアルゴリズムが使用されなければならない事を暗示したり要求しません。 universally unique identifier (UUID) もまた見て下さい。
universally unique identifier (UUID)
128ビットの値。 UUID は、極めて短い寿命をオブジェクトに持たせる事から、クライアント・サーバーインターフェース、マネジャーエントリポイントベクトル、RPC オブジェクトなどといったクロスプロセス通信において 非常に持続的なオブジェクトを確かに識別する事まで、多目的に利用する事ができます。 UUID は一意である可能性が高いです。 UUID は globally unique identifier (GUID) としても知られており、これらの用語は Microsoftプロトコル技術文書 (TD) 中で区別なく使用されています。 これらの用語の用法を置き替えることは、UUID を生成するために 特定のアルゴリズムまたはメカニズムを暗示したり必要としません。 特に、この用語の使用は、UUID を生成するために [RFC4122] または [C706] において指定されたアルゴリズムが使用されなければならない事を暗示したり要求しません。
使用例 1 , 使用例 2 (他の方と重複しないように注意深く使用して下さい。)
最近の実装では、どの Windows 上で生成しても UUID v4 レベルらしいです。


KeyPath for the Component
コンポーネントの為のキーパス。このファイルまたはフォルダーがインストールされているかどうかで、コンポーネント全体 がインストールされているかどうかを判断される。( 参照 )


MSBuild
Microsoft ビルド エンジン。( 参照 参照 )


MSDN
Microsoft Developers Network。開発総合支援サービスだそうです。( 参照 )


ProductCode
一度決めて .msi を配布し始めたら もう変更しない事。メジャーバージョン アップごと、32/64ビット版の違いごと に変える。Version、Language も セットする事。 MSDN ( 英語 ) ( 参照 )
Language の違いだけでも「ターゲットマシン上で共存させる必要がある」場合に、Windows Installer における 別プロダクト化 ( GUID コードの変更) が必要になる。

図.(同族プロダクトでの)3種類のコードの概要

Patching and Upgrades 英語 )などを読んで、ご自身で判断して下さい。


UpgradeCode
一度決めて .msi を配布し始めたら もう変更しない事。同じプロダクトのバージョン アップ、 同一バージョンの別言語版(日本語/英語 など)なら 同じコード。 MSDN ( 英語 ) ( 参照 )


Windows SDK
SDKは、Software Development Kit ソフトウェア開発キット。以前は SDK が2種類あって、 別々に配布されていました。Windows ネイティブコード用のPlatform SDKと、.NET Framework用の .NET Framework SDKです。これらが統合されて一緒に配布されるようになりました。これが Windows SDKです。( 参照 )


WiX のエレメント
wix.chm 内の WiX Schema Reference または、ここ(このサイト) と ここからのリンク先(本家サイト) に書いてあり、 とても重要です。

File エレメントなどの Id と Name 属性では、Windowsインストーラーが動作の為に使うのが Id 、 Nameは実際のファイル名です。
Idデータ型は、テキスト文字列です。Idは、ASCII文字 A-Z (a-z) 、数字、下線( _ )、ピリオド( . )を含んでいる事ができます。けれど、すべてのIdが 文字または下線から始まらなければなりません。 MSDN ( 英語 )
ファイル名データ型は、半角英数の 長いファイル名と短いファイル名の両方に含められない文字( / ? ¦ < > : \ * " )、 短いファイル名には追加で含められない文字( + , ; = [ ] )を除いた テキスト文字列です。 MSDN ( 英語 )
Source (WiX 2 でいう Src ) 属性があれば、Name 属性は無くてもいいはずです。


アドバタイズ
アプリケーションを最小限にインストールしておいて、ショートカットからの呼び出しで 初めて使用される時に ファイルがインストールされること。MSDN ( 英語 )


言語 (コード ページ)
デフォルトは en-us で、Codepage="1252" Language="1033"。ja-jp は、Codepage="932" Language="1041" 。( CodePage, LCID



WixEdit
オープンソースの WiX エディタ。 WixEdit
ドキュメントが 付属していません。やる事が分かっていれば、大丈夫でしょう。
メモ帳と同時併用したりで 外部プログラムでソースを変更した場合、「Windows のタスクバー」で「Reload?」と、 尋ねられている場合があります。気を付けて。


WixEdit の UISample の使用例
普通に .wxs ファイルとその中身を作成する。そのフォルダーに、 <WixEditのインストール先>¥templates¥UISample の中のファイル・フォルダー全部を コピーする。 .wxs ファイルに <?include UISample.wxi?> を 追加する。ビルドすれば、完成 。
.msi が WixUIExtension より 少し小さくなる。Sample だから カスタマイズ可能。でも 英語版。



メモ

msiexec.exe のオプションは、大文字小文字を区別しない(プロパティなどは除く)。
/i, /x, /f[p|o|e|d|c|a|u|m|s|v], /j[u|m], /a, /p, /y, /z は、一緒に使うべきではない(どれか)。
例外として、管理インストールへのパッチでは /p と /a の両方を使う必要がある。
/t, /c, /g は、/j と共にだけ使うべき。
/l, /q は、/i, /x, /f[p|o|e|d|c|a|u|m|s|v], /j[u|m], /a, /p と共に使う事が出来る。
/n は、/i, /f, /x, /p と共に使う事が出来る。
/i と PATCH プロパティは一緒に使えるが、/p とは一緒に使えず、無視、上書きされる。
( Command Line Options 日本語 ))
# 手元の Windows で「ファイル名を指定して実行」などで「msiexec.exe /h」で説明が出る。


Windows Installer は プロダクトバージョンの最初の3桁だけを使う。
メジャーアップグレードは、アプリケーションが ユーザーごとにインストールされていれば ユーザーごと、マシンごとでインストールされていればマシンごと、でしか適用できない。状況を 跨いでインストールできない。いったんアンインストールするしかない。
Upgradeテーブルを使ってのアップグレードの為に、ProductVersionの3つのフィールドのうちの 少なくとも1つが、変更されなければならない。
バージョンの最大値は、255.255.65535 まで。
( Major Upgrades , ProductVersion Property )


TARGETDIR は、インストール先のルート ディレクトリ。.msi に必ず含める。管理インストールでは、 コピー先になる。
TARGETDIR を SourceDir にする。( WiX表記: <Directory Id="TARGETDIR" Name="SourceDir"> )
TARGETDIR が未定義なら、パスの解決に ROOTDRIVE が使用される。
SourceDir は、インストール パッケージがあるディレクトリ。
( TARGETDIR Property , SourceDir Property )


プロダクトが マシンごとかカレントユーザーにインストールされている場合にだけ、Installed プロパティがセットされる。別のユーザーだけにインストールされていると セットされない。
コンピュータごとやカレントユーザーにインストールされているかどうかを決定するのに、条件式で 使用できる。例えば、最初のインストールとメンテナンス インストールを区別するのに使える。
( Installed Property )
# Windows Installer が自動設定する。WiX で定義しなくて良い。


アクションは、インストールやメンテナンスモードの間に行われる典型的な機能をカプセル化している。
Windows Installer は、シーケンステーブル中で使用するたくさんのビルトイン スタンダードアクションを 持っている。
スタンダードアクションはほとんどの場合でインストールを実行するのに十分だけれど、 カスタムアクションで EXE, DLL, スクリプトをインクルードして機能拡張できる。
( Standard Actions , About Standard Actions , About Custom Actions )


アップグレードやアップデートのインストール時に、既存のアプリケーションのフィーチャーの インストール状態を反映させたい場合に CostFinalize アクションの直後に挿入する。 InstallUISequence と InstallExecuteSequence の両方に入れる。
( MigrateFeatureStates Action )


ファイルの置き換えは、コンポーネントのキーファイルで比較され、コンポーネント単位。
バージョン、日付、言語の3つで比較。
デフォルトのルールは、REINSTALLMODE プロパティでオーバーライドできる。
( Replacing Existing Files )


バージョンの無いファイルには、ハッシュを付ける事。
(このページの下の4つの説明は、copy-A を copy-B がある所にインストールするダイアグラム。)
( Default File Versioning )
# WiX では自動でハッシュが付くはず。上書きルールの理解は重要。


自己登録ファイルに関して、SelfReg Table と TypeLib Table は使わずに Registry Table を使う事。自己登録させない。
( SelfReg Table , TypeLib Table )


UI を自分で作成するなら アクセシビリティに注意しろとの事。
( Accessibility , ユーザー補助アプリケーションのデザイン , アクセシビリティ デベロッパー センター )


MSIINSTALLPERUSER プロパティは Windows Installer 5.0 以降。以前のものでは無視される。
ALLUSERS=2 でなければ MSIINSTALLPERUSER プロパティは無視される。
ALLUSERS=2 を使うと、実行時に ALLUSERS=1 か ALLUSERS="" にリセットされる。
( Installation Context , MSIINSTALLPERUSER Property )


ALLUSERS="": per-User
ALLUSERS=1 : per-Machine
ALLUSERS=2 を使う場合:
per-User
7 ALLUSERS=2 MSIINSTALLPERUSER=1
Vista(記述なし)
XP ALLUSERS=2 (ユーザー権限が無ければ失敗)
2000 (記述なし)
per-Machine
7 ALLUSERS=2 MSIINSTALLPERUSER=""(管理者権限が無ければ失敗)
VistaALLUSERS=2 (管理者権限が無ければ失敗)
XP (記述なし)
2000 ALLUSERS=2 (管理者権限が無ければ per-User に自動変更)
推奨されるデフォルトは per-User 。
( ALLUSERS Property )


# サーチは以下の順で動く(WiX表記)。パブリックプロパティを使う事。
  1. ComponentSearch
  2. RegistrySearch
  3. IniFileSearch
  4. FileSearch か DirectorySearch
( Searching for Existing Applications, Files, Registry Entries or .ini File Entries )


# 「プログラムの追加と削除」の項目。
( Configuring Add/Remove Programs with Windows Installer )


インストールパッケージなどができたら Orca か Msival2.exe で Validationを実行すべき。
( Package Validation , Validating an Installation Database , Validating an Installation Upgrade , Validating Merge Modules )


アドバタイズド ショートカットを働かせるには マシンの再起動が必要。
( Platform Support of Advertisement )


システムのIShellLinkインターフェースがインストーラーデスクリプタ解決をサポートしている場合にだけ アドバタイズショートカットの作成が有効になる。これは Windows 2000 IE 4.01 以降。
サポートしていない場合には 非アドバタイズショートカットが作成される。
アドバタイズショートカットは、ProductCode により識別される 特定のアプリケーションを常に 指していて、 アプリケーション間で共有されるべきではない事に 注意。
アドバタイズショートカットは、最も新しくインストールされたアプリケーションの為だけに働き、 そのアプリケーションが削除される時に 削除される。
( Shortcut Table Remarks )


ベストプラクティス。( Windows Installer Best Practices )


MSM 警告へのコメント:
1. 同じ名前を持つアクションが複数のマージモジュール中にある。最初のもの以外を除外される。 同一の物だから機能は失われておらず、無視して良い。
2. (ICE03) いくつかの ID が MSI の _Validation テーブルで指定される最大値よりも長い。 Windows Installer は内部的には幅を制限していないから、無視して良い。
3. (ICE30) 同じファイルを同じフォルダにインストールする異なるコンポーネントをオーサリングする事を 避ける助けになる。今の場合は、コンポーネントが相互に排他的な条件( Win9x 用と WinNT 用)を持っているので、無視して良い。
4. (ICE82) アクションが InstallExecuteSequence テーブル中で重複したシーケンスナンバーを持っている。 アクションが重複したシーケンスナンバーを持っている時、どの順で実行されるかは無保証。 今の場合は、順番に依存性がないので、無視して良い。
5. (ICE83) WinSxS コンポーネントストアにインストールされる Win32 グローバルアセンブリに 間違ったキーパスファイルをオーサリングする事を 避ける助けになる。アセンブリが Win32 ポリシーアセンブリでない限り、キーパスはマニフェストファイルであるべきではない。 今の場合には、Win32 ポリシーアセンブリだから、無視して良い。
( Aaron Stebner's WebLog (VC8.0 MSM) )


Windowsインストーラーエラーは、1000以上の番号のエラーコードを持っている。
1000から1999までの番号のエラーコードは搭載するエラーで、Errorテーブル中にオーサリングされなければならない。 2000以上の番号のエラーコードは内部エラーでありオーサリングされた文字列を持たないが、 正しくなくオーサリングされてしまったインストールパッケージの場合に 発生し得る。 予約エラーコードのリストは Errorテーブルを見る事。
注: あなたが、アプリケーションのインストールやアンインストールの最中や後で 困難に直面しているユーザーなら、インストールやアンインストールしようとしている ソフトウェアのカスタマーサポートに連絡すべきです。 マイクロソフト製品についてサポートを必要としていると感じているならば、技術サポートサイト support.microsoft.com に行って下さい。
注: 以下の表とマイクロソフト サポートナレッジベース(KB)で たくさんのメッセージの 解決法を探せます。http://support.microsoft.com/search/?ln=ja で 「 "Windows インストーラ" メッセージコード kberrmsg 」の3つを入力 (メッセージコードは置き換える)。
# これ など。
注: オンラインMSDNライブラリーを使ってこのドキュメントを見ているなら、 特定エラーメッセージについての解決法が投稿されているかどうかを見るのに、 このページの下部のコミュニティコンテンツエリアもチェックできます。
インストールパッケージの作成者は、ICEを使って内部整合性もテストできます。詳細については、 Internal Consistency Evaluators - ICEs を見る事。
MsiExec.exeやInstMsi.exeによって返された Error Codes も見る事。
( Windows Installer Error Messages )
# WixUIのローカライズファイル中にある程度入っている。その他はこのページで英語。


このページのエラーコードが MsiExec.exeやInstMsi.exeによって返される。 WinError.h中のあらゆるエラーが 同様に返され得る事に 注意。
注: エラーコード ERROR_SUCCESS, ERROR_SUCCESS_REBOOT_INITIATED, ERROR_SUCCESS_REBOOT_REQUIRED は、成功をうかがわせる。もし ERROR_SUCCESS_REBOOT_REQUIRED が返されたら、インストールが首尾よく完了したけれど インストールを完了させるには 再起動が必要。
Windowsインストーラーによって返されるエラーコードについては Windows Installer Error Messages を見る事。
注: あなたが、アプリケーションのインストールやアンインストールの最中や後で 困難に直面しているユーザーなら、インストールやアンインストールしようとしている ソフトウェアのカスタマーサポートに連絡すべきです。 マイクロソフト製品についてサポートを必要としていると感じているならば、技術サポートサイト support.microsoft.com に行って下さい。
( Error Codes )


# Windows 7とWindows Server 2008 R2のWindowsインストーラー5.0における、 デュアルパーパス パッケージと、UAC資格証明プロンプトを出させないper-userパッケージの為の ガイドライン。
# 最近はセキュリティの為に UACを出させないper-user が 推奨らしい。 そのper-userで使えないものが記載されている。
( Single Package Authoring )


その他 詳細はやはり MSDN の英語を参照。