我正在使用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);
答案 0 :(得分:3)
查看MsiGetProductInfo函数及其INSTALLPROPERTY_LOCALPACKAGE属性。这应该能够返回[WindowsFolder] Installer中缓存的MSI的路径,从那里你应该能够使用MsiOpenDatabase和其他相关函数来查询Component表来获取你正在寻找的信息。