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