Что именно IUpdate::BundledUpdates извлекает?
Когда мы пытаемся получить информацию о Центре обновления Windows с помощью API-интерфейса WUA, я выполняю следующий процесс. Но я немного запутался со свойством IUpdate::BundledUpdates.
- Создать IUpdateSearcher
- Поиск на основе критериев поиска. Я указал критерии поиска как "IsHidden=1 или IsInstalled=1"
- Вы будете иметь IUpdateCollection как результат поиска.
- Используя get_Item в IUpdateCollection, я извлекал каждое обновление (IUpdate) и печатал требуемые значения (в моем случае номера КБ).
- Но опять же в 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;
}