Я использую 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);