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

Winapi 查找已安装产品的所有组件,winapi,windows-installer,Winapi,Windows Installer,我正在使用msi windows api以编程方式管理一些已安装的程序 我知道产品代码,但我希望找到与此产品相关的所有组件 我知道如何枚举系统中的所有组件,并查询组件的产品代码。因此,一个显而易见的解决方案是迭代所有这些组件,并对产品ID执行字符串比较。(参见下面的代码) 但这表现糟糕。在我的机器上,此代码正在搜索37601个组件,以查找匹配的8个组件 在给定产品标识符的情况下,是否存在只列出该产品组件的API调用 do { // productGuid is a std::wstrin

我正在使用msi windows api以编程方式管理一些已安装的程序

我知道
产品
代码,但我希望找到与此产品相关的所有
组件

我知道如何枚举系统中的所有组件,并查询组件的产品代码。因此,一个显而易见的解决方案是迭代所有这些组件,并对产品ID执行字符串比较。(参见下面的代码)

但这表现糟糕。在我的机器上,此代码正在搜索37601个组件,以查找匹配的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);

看看MsiGetProductInfo函数及其INSTALLPROPERTY\u LOCALPACKAGE属性。这应该能够返回[WindowsFolder]安装程序中缓存的MSI的路径,并且从那里您应该能够使用MsiOpenDatabase和其他相关函数来查询组件表以获取您正在查找的信息