インストールされたアプリケーションを製品として扱うという特徴を持っています。製品として扱うことで、製品の様々な情報をMSIの関数で統一的に取得することができるようになります。製品は、次に示すレジストリキーにて管理されています。UserDataサブキー以下に、システムに存在するユーザーをテキスト形式のSIDで表したサブキーが列挙されている。その他のSIDを見れば特定のユーザーにインストールされた製品を確認することができる。Productsサブキー以下に、システムに存在する全ユーザーに対してインストールされた製品が列挙される。ユーザーが見ることのない、内部的な情報を管理している。Productsサブキー以下に、現在ログオンしているユーザーに対してインストールされた製品が列挙される。ユーザーが見ることのない、内部的な情報を管理している。それで足りない場合は他のレジストリキーを参照するとよいと思われます。レジストリでは、製品をGUID形式の製品コードで表していないので注意してください。基本的にはMSI関数を呼び出せば目的の情報を得ることができます。MsiEnumProductsを呼び出すとよいでしょう。lpProductBuf);iProductIndexは、取得したい製品のインデックスをゼロベースで指定します。それを続けることになるでしょう。lpProductBufは、指定したインデックスに相当する製品の製品コードが返ります。製品コードを取得すれば、MsiGetProductInfoで製品の情報を取得できます。*pcchValueBuf);szProductは、情報を取得したい製品の製品コードを指定します。szPropertyは、取得したい製品のプロパティを指定します。lpValueBufは、プロパティの値を受け取るためのバッファのアドレスを指定します。pcchValueBufは、バッファのサイズを格納した変数のアドレスを指定します。近い意味を持ちますが、いくつか新しいプロパティを定義しています。次に、プロパティと指定できる定数と文字列の一部を示します。インストールされた製品の名前。インストールの際に使用したMSIファイルをキャッシュしているパス。インストール時に登録したユーザー名。その値はInstalledProductNameとなっています。これらのプロパティに関しては文字列を直接指定することになります。選択された製品コードの情報を右側のリストボックスに追加します。それなりの数の製品コードがリストボックスに追加されるのではないかと思います。MsiEnumProductsを呼び出しているのは、WM_CREATEの次の部分です。(LPARAM)szProductCode);}iを製品インデックスとして利用し、ループでカウントしていきます。このときは関数が成功していないとみなし、ループを抜けることになります。それを基にMsiGetProductInfoを呼び出しています。(LPARAM)szBuf);}lpszPropertyNameは、MsiGetProductInfoに指定可能なプロパティを持つ配列です。プロパティの値を取得し、プロパティ名と値を文字列として整形してから追加します。求められることがありますが、これらの情報はユーザー情報という分類に入ります。MsiGetUserInfoという専用の関数が用意されているので、その使い方を検討します。製品のユーザー情報を取得して表示するのが目的です。後の引数も企業名、製品IDというように同じ要領で続きます。指定した情報が存在しなかった場合は、noneという文字列が格納されます。