2011-10-25 73 views
3

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

回答

3

看看MsiGetProductInfo函數,它是INSTALLPROPERTY_LOCALPACKAGE屬性。這應該能夠在[WindowsFolder]安裝程序中向您返回緩存MSI的路徑,並且您應該可以使用MsiOpenDatabase和其他相關功能來查詢Component表以獲取您正在查找的信息。

相關問題