Что именно IUpdate::BundledUpdates извлекает?

Когда мы пытаемся получить информацию о Центре обновления Windows с помощью API-интерфейса WUA, я выполняю следующий процесс. Но я немного запутался со свойством IUpdate::BundledUpdates.

  1. Создать IUpdateSearcher
  2. Поиск на основе критериев поиска. Я указал критерии поиска как "IsHidden=1 или IsInstalled=1"
  3. Вы будете иметь IUpdateCollection как результат поиска.
  4. Используя get_Item в IUpdateCollection, я извлекал каждое обновление (IUpdate) и печатал требуемые значения (в моем случае номера КБ).
  5. Но опять же в IUpdate у вас есть свойство BundledUpdate, которое дает IUpdateCollection с методом get_BundledUpdates(). Когда я перебрал результаты BundledUpdates, я не получил никаких результатов.

Я что-то упускаю при получении пакетов обновлений? (ИЛИ) включает ли указанный мной критерий "Связанные обновления" как часть первого набора результатов IUpdateCollection?

Также в MSDN отсутствуют примеры для каждого интерфейса в WUA API. Может ли кто-нибудь предоставить какие-либо ресурсы, которые четко объясняют, что делает каждый интерфейс в WUA API?

Добавлен полный исходный код консольного приложения C++:

#include <wuapi.h>
#include <iostream>
#include <wuerror.h>

using namespace std;


int main()
{

    HRESULT hr;
    hr = CoInitialize(NULL);

    IUpdateSession* iUpdate;
    IUpdateSearcher* searcher;
    ISearchResult* results;
    BSTR criteria = SysAllocString(L"IsInstalled=1 or IsHidden=1 or IsPresent=1");

    hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER,
        IID_IUpdateSession, (LPVOID*)&iUpdate);
    hr = iUpdate->CreateUpdateSearcher(&searcher);

    wcout << L"Searching for updates ..."<<endl;
    hr = searcher->Search(criteria, &results);
    SysFreeString(criteria);

    switch(hr)
    {
    case S_OK:
        wcout<<L"List of applicable items on the machine:"<<endl;
        break;
    case WU_E_LEGACYSERVER:
        wcout<<L"No server selection enabled"<<endl;
        return 0;
    case WU_E_INVALID_CRITERIA:
        wcout<<L"Invalid search criteria"<<endl;
        return 0;
    }

    IUpdateCollection * updateList;
    IUpdate *updateItem;
    LONG updateSize;
    BSTR updateName;

    results->get_Updates(&updateList);
    updateList->get_Count(&updateSize);

    if (updateSize == 0)
    {
        wcout << L"No updates found"<<endl;
    }

    for (LONG i = 0; i < updateSize; i++)
    {
        IStringCollection *KBCollection;
        LONG KBCount;
        updateList->get_Item(i, &updateItem);
        updateItem->get_KBArticleIDs(&KBCollection);
        KBCollection->get_Count(&KBCount);
        for(int k=0;k<KBCount;k++)
        {
            BSTR KBValue;
            KBCollection->get_Item(k,&KBValue);
            wcout << L"KB" << KBValue << endl;
        }

        //Retrieve the bundled updates
        IUpdateCollection *updtCollection;
        updateItem->get_BundledUpdates(&updtCollection);
        LONG updtBundledCount;
        updtCollection->get_Count(&updtBundledCount);
        for(LONG j=0;j<updtBundledCount;j++)
        {
            cout<<"Bundled KBs" <<endl;
            IUpdate *bundledUpdateItem;
            updtCollection->get_Item(j,&bundledUpdateItem);
            bundledUpdateItem->get_KBArticleIDs(&KBID);
            if(KBID != NULL)
            {
                LONG KBCount;
                BSTR KBIDValue;

                KBID->get_Count(&KBCount);
                for(LONG j=0;j<KBCount;j++)
                {

                    wcout << "KB" <<(KBIDValue) << endl;
                    temp.setKBID(KBIDValue);
                }
            }
        }
    }

    wcout << L"Total KB Count : " << updateSize << endl;
    CoUninitialize();

    return 0;
}

1 ответ

Решение

Я просто исправляю твой код, чтобы получить пакетные обновления.

#include "stdafx.h"
#include <wuapi.h>
#include <iostream>
#include <wuerror.h>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    hr = CoInitialize(NULL);

    IUpdateSession* iUpdate;
    IUpdateSearcher* searcher;
    ISearchResult* results;
    BSTR criteria = SysAllocString(L"IsInstalled=1 or IsHidden=1 or IsPresent=1");

    hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (LPVOID*)&iUpdate);
    hr = iUpdate->CreateUpdateSearcher(&searcher);

    wcout << L"Searching for updates ..."<<endl;
    hr = searcher->Search(criteria, &results); 
    SysFreeString(criteria);

    switch(hr)
    {
    case S_OK:
        wcout<<L"List of applicable items on the machine:"<<endl;
        break;
    case WU_E_LEGACYSERVER:
        wcout<<L"No server selection enabled"<<endl;
        return 0;
    case WU_E_INVALID_CRITERIA:
        wcout<<L"Invalid search criteria"<<endl;
        return 0;
    }

    IUpdateCollection *updateList;
    IUpdate *updateItem;
    LONG updateSize;
    BSTR updateName;

    results->get_Updates(&updateList);
    updateList->get_Count(&updateSize);

    if (updateSize == 0)
    {
        wcout << L"No updates found"<<endl;
    }

    for (LONG i = 0; i < updateSize; i++)
    {
        IStringCollection *KBCollection;
        LONG KBCount;
        updateList->get_Item(i,&updateItem);
        updateItem->get_Title(&updateName);
        wcout<<i+1<<" - "<<updateName<<endl;

        IUpdateCollection *updtCollection;
        LONG updtBundledCount;        
        //Retrieve the bundled updates
        updateItem->get_BundledUpdates(&updtCollection);
        hr = updtCollection->get_Count(&updtBundledCount);
        if ((updtBundledCount>0) && (hr ==S_OK))
        {
            wcout << L"Bundled Updates " <<(updtBundledCount) << endl;
            for(LONG j=0;j<updtBundledCount;j++)
            {
                IUpdate *bundledUpdateItem;
                BSTR bundledName;
                updtCollection->get_Item(j,&bundledUpdateItem);   
                bundledUpdateItem->get_Title(&bundledName);
                wcout<<L"    "<<j+1<<" - "<<bundledName<<endl;
            }
        }
    }
    ::CoUninitialize();
    wcin.get();
    return 0;
}
Другие вопросы по тегам