Найти все компоненты установленного продукта - PullRequest
3 голосов
/ 26 октября 2011

Я использую MSI Windows API для программного управления некоторыми установленными программами.

У меня есть случай, когда я знаю код Product, но я хочу найти все Components, которые относятся к этому продукту.

Я знаю, как перечислять все компоненты системы и запрашивать код продукта компонента. Таким образом, очевидное решение состоит в том, чтобы просто пройти через все эти компоненты и выполнить сравнение строк по идентификаторам продуктов. (См. Код ниже).

Но это плохо работает. На моей машине этот код просматривает 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);

1 Ответ

3 голосов
/ 26 октября 2011

Посмотрите на функцию MsiGetProductInfo и ее свойство INSTALLPROPERTY_LOCALPACKAGE. Это должно быть в состоянии вернуть вам путь к кэшированному MSI в [WindowsFolder] Installer, и оттуда вы сможете использовать MsiOpenDatabase и другие связанные функции для запроса таблицы компонентов для получения информации, которую вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...