Search code examples
c++winapiwindows-update

Windows Update Agent pure win32 APIs


I'm developing a sample code to get information about the Windows Updates Monitoring. I bumped into Windows Update Agent APIs. link: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387099(v=vs.85).aspx

But I'm not able to find any APIs for win32. I find only C#/.NET Interfaces. Are there any corresponding win32 APIs?

Specifically I want to find out the "release date" of a windows update/patch. Look forward to any suggestions and guidance.

  • Srivathsa

Solution

  • The WUA API includes a set of COM interfaces which can be used from C++ Apps, so try these IUpdateSearcher, IUpdateSession and IUpdate.

    Check this sample c++ application which retrieve the updates and the date of release.

    #include "stdafx.h"
    #include <wuapi.h>
    #include <iostream>
    #include <ATLComTime.h>
    #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;
        DATE retdate;
    
        results->get_Updates(&updateList);
        updateList->get_Count(&updateSize);
    
        if (updateSize == 0)
        {
            wcout << L"No updates found"<<endl;
        }
    
        for (LONG i = 0; i < updateSize; i++)
        {
            updateList->get_Item(i,&updateItem);
            updateItem->get_Title(&updateName);
            updateItem->get_LastDeploymentChangeTime(&retdate);
            COleDateTime odt;
            odt.m_dt=retdate;
            wcout<<i+1<<" - "<<updateName<<"  Release Date "<< (LPCTSTR)odt.Format(_T("%A, %B %d, %Y"))<<endl;
        }
        ::CoUninitialize();
        wcin.get();
        return 0;
    }