WiX Toolset で生成した MSI ファイルを Windows Installer で実行する時、ログを出力するには、下記のようなオプションをつければよい。
msiexec.exe /i AppInstaller.msi /l*v installer.log
これで、 installer.log に MSIファイル実行時のログが出力される。ちなみに、/l*v
は、全ての情報の詳細をログに出力することを示している。
カスタムアクションからのログ出力
WiX Toolset に含まれる SDK を使用すれば、C/C++で実装されたカスタムアクションからも上記のログファイルにログを出力し、デバッグや障害時の原因調査に役立てることができる。
SDKの使用方法
WiX Toolset のインストールフォルダの直下には、SDK
フォルダがあり、SDKを構成するファイル一式が格納されている。SDK
フォルダの下には、Visual Studio のバージョンごとにフォルダが配置され、その中にC/C++のヘッダファイル(*.h
)およびライブラリファイル(*.lib
)が格納されている。
[WiX Toolset のインストールフォルダ]
└ SDK
├ VS2010
├ VS2012
├ VS2013
├ VS2015
└ VS2017
├ inc
│ └ [各種 *.h ファイル]
└ lib
├ x64
│ └ [各種 *.lib ファイル]
└ x86
inc
フォルダ内にヘッダファイルは数十個存在するが、今回の目的はログの出力なので、カスタムアクションを定義したDLLのプロジェクトからは、wcautil.h
を include すればよい。また、ライブラリファイルについては、wcautil.lib
の他dutil.lib
のリンクが必要となる。
なお、この記事を書いている時点における最新安定バージョンの WiX Toolset ver. 3.11.2 では、 Visual Studio 2019 以降用のディレクトリが存在しないが、VS2017
ディレクトリ内の*.h
ファイルおよび*.lib
ファイルを使用して、Visual Studio 2019によりビルドしても、この記事の内容の範囲内であれば正常に動作させることができた。
ログ出力関数の呼び出し
UINT WINAPI CustomActionFunc(MSIHANDLE hInstall)
{
INT val = 0;
BOOL err = FALSE;
HRESULT hResult = WcaInitialize(hInstall, "CustomActionFunc");
if (FAILED(hResult))
{
return ERROR_INSTALL_FAILURE;
}
// Do something. (omit)
if (err) {
//Error occurred
return WcaFinalize(ERROR_INSTALL_FAILURE);
}
WcaLog(LOGMSG_STANDARD, "Value: %d", val);
return WcaFinalize(ERROR_SUCCESS);
}
上記コードのCustomActionFunc
は、カスタムアクションを実装したDLLの関数で、内部で WiX Toolset の SDK を使用して、ログ出力を行なっている。
まず、WcaInitialize
を呼び出し、フレームワーク(SDKのソースコード中では「Wcaフレームワーク」と呼ばれている)の初期化を行なっている。この時第2引数で指定された文字列が、ログに出力されるカスタムアクション名となる。
ログ出力を行うのはWcaLog
関数で、第1引数でログレベルを指定する。ログレベルは下記の3種類から指定可能となっている。
- LOGMSG_STANDARD
常にログ出力される。通常はこれを指定すればよい。 - LOGMSG_VERBOSE
次のように、LOGVERBOSE
プロパティが有効にされた場合にログ出力される。
msiexec.exe /i AppInstaller.msi /l*v installer.log LOGVERBOSE=1
- LOGMSG_TRACEONLY
ログ出力されない。( SDK 自体がデバッグビルドされている場合のみログ出力される)
第2引数以降でログ出力内容を指定する。printf
同様の書式設定が可能となっており、第2引数で書式文字列を、可変長の第3引数以降で書式に渡すパラメータを指定する。
最後に、WcaFinalize
はフレームワークをクリーンアップする関数で、WcaInitialize
と対で呼び出す必要がある。
WcaFinalize
は通常、引数の値を返すが、WcaSetReturnValue
関数でERROR_SUCCESS
以外の値がセットされている場合は、その値を返すようになっている。(一度もWcaSetReturnValue
が呼ばれていない場合の初期値は、ERROR_SUCCESS
である。)
ドキュメントについて
探した限りでは、WiX Toolset の配布物にSDKのドキュメントは付属していない。ヘッダファイルを見ても、関数の説明は書かれていないので、ソースコードを参照するのがよいだろう。WiX Toolset のソースコードは、GitHubで公開されており、 src\libs
以下がSDKのソースコードとなっている。