Windows InstallerのComboBoxの内容を実行時に設定する方法

Windows InstallerのカスタムダイアログでComboBoxを使う場合、ComboBoxに列挙する要素は以下のテーブルに書きます。
http://msdn.microsoft.com/en-us/library/aa367872.aspx

テーブルにという時点で想像がつく通り、どこかのプロパティに値をセットすればすむなんて簡単な話ではありません。*1ComboBoxに表示するリストを実行時に動的に作成する場合、実行中にMSIのテーブルを書き換えましょう。


以下サンプルコード。 hInstはカスタムアクションの引数のMSIHANDLEです。

PMSIHANDLE hDatabase = MsiGetActiveDatabase(hInst);
PMSIHANDLE hView;
MsiDatabaseOpenView(hDatabase, "SELECT * FROM ComboBox", &hView);

PMSIHANDLE hRec = MsiCreateRecord(4);
MsiRecordSetString(hRec, 1, "PROPERTY");
MsiRecordSetInteger(hRec, 2, 1);
MsiRecordSetString(hRec, 3, "VALUE");
MsiRecordSetString(hRec, 4, "TEXT");
MsiViewModify(hView, MSIMODIFY_INSERT_TEMPORARY, hRec);

MsiCreateRecord以降MsiViewModifyまでは必要に応じて繰り返してください。
MSIのデータベースの変更についてはあんまり詳しくないので何か間違ってるかもしれません。
たぶんListBoxの場合もほぼ同じだと思います。試してませんが。


なお、ComboBoxのデフォルト値はProperty Tableでプロパティに値をセットしておくことで設定できます。プロパティにセットした値がComboBox TableのValueに存在しない場合、表示されません。


ついでに。
Windows 2000ではComboBoxのheightをちゃんと指定しておかないと、表示領域の高さ不足でドロップダウンリストが表示されなかったりします。XP、Vista、7ではHeightの指定を無視して表示領域いっぱいまで表示してくれるようです。*2

*1:プロパティに"Value"="Text",...みたいな形式で指定すればComboBoxが読んでくれる、とかだったら楽なのに

*2:なんかやってみたらそうなりました。詳しい仕様は知りません。