【发布时间】:2011-10-25 23:32:03
【问题描述】:
我正在使用 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);
【问题讨论】: