0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【WiX Toolset】カスタムアクションからログを出力する

Posted at

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)が格納されている。

SDKのディレクトリ構成
[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のソースコードとなっている。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?