2011-10-25 17 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テーブルをクエリできます。

関連する問題