查找已安装产品的所有组件

时间:2011-10-25 23:32:04

标签: winapi windows-installer

我正在使用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);

1 个答案:

答案 0 :(得分:3)

查看MsiGetProductInfo函数及其INSTALLPROPERTY_LOCALPACKAGE属性。这应该能够返回[WindowsFolder] Installer中缓存的MSI的路径,从那里你应该能够使用MsiOpenDatabase和其他相关函数来查询Component表来获取你正在寻找的信息。