インストール済みのプログラムをプログラムで管理するためにmsi windows apiを使用しています。インストールされた製品のすべてのコンポーネントを見つける
私はProduct
コードを知っている場合がありますが、私はこの製品に関連するComponents
をすべて見つけたいと思います。
私は、システム内のすべてのコンポーネントを列挙し、コンポーネントの製品コードを照会する方法を知っています。だから明らかな解決策は、これらのコンポーネントすべてを繰り返し処理し、製品IDの文字列比較を実行することです。 (下のコードを参照してください)。
しかし、これは悪い結果を出します。私のマシンでは、このコードは37,601個のコンポーネントを検索し、一致する8個のコンポーネントを見つけます。
製品識別子が与えられていると、その製品のコンポーネントだけが一覧表示されるAPI呼び出しがありますか?
do
{
// productGuid is a std::wstring
TCHAR componentBuffer[39];
msiReturn = ::MsiEnumComponents(componentIndex++, componentBuffer);
if(msiReturn != ERROR_NO_MORE_ITEMS)
{
TCHAR productBuffer[39];
UINT productReturnCode = ::MsiGetProductCode(componentBuffer, productBuffer);
if(productGuid == productBuffer)
{
// Add this to the matching component ids
}
}
}
while (msiReturn != ERROR_NO_MORE_ITEMS);