potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++ WILとWindows Update Agent APIでWUA APIのバージョンを取得する

WILとWindows Update Agent API(WUA API)でWindowsUpdateAgentInfoを作成・管理してWUA APIのバージョンを取得するサンプルコードです。

// C++20

#include <iostream>

#pragma comment(lib, "propsys.lib")
#define STRICT
#define NOMINMAX
#include <Windows.h>
#include <propvarutil.h>
#include <wuapi.h>

#include <wil/com.h>
#include <wil/resource.h>

namespace wil_util
{
    using namespace wil;

    template <typename T>
    concept com_raw_ptr_callable = requires(T t) { com_raw_ptr(t); };

    template <com_raw_ptr_callable STRING_TYPE>
    unique_variant make_unique_variant_from_string_failfast(STRING_TYPE& psz)
    {
        unique_variant var;
        FAIL_FAST_IF_FAILED(InitVariantFromString(str_raw_ptr(psz), &var));
        return std::move(var);
    }

    inline auto make_cotaskmem_string_from_variant_get_failfast(const VARIANT& var)
    {
        LPWSTR psz;
        FAIL_FAST_IF_FAILED(VariantGetStringElem(var, 0, &psz));
        return make_cotaskmem_string_failfast(psz);
    }
}

int main()
{
    auto couninit = wil::CoInitializeEx_failfast();

    auto infoIdApiMajorVersion = wil_util::make_unique_variant_from_string_failfast(L"ApiMajorVersion");
    auto infoIdApiMinorVersion = wil_util::make_unique_variant_from_string_failfast(L"ApiMinorVersion");
    auto infoIdProductVersionString = wil_util::make_unique_variant_from_string_failfast(L"ProductVersionString");

    auto windowsUpdateAgentInfo = wil::CoCreateInstanceFailFast<WindowsUpdateAgentInfo, IWindowsUpdateAgentInfo>();

    wil::unique_variant apiMajorVersion;
    wil::unique_variant apiMinorVersion;
    wil::unique_variant productVersionString;
    FAIL_FAST_IF_FAILED(windowsUpdateAgentInfo->GetInfo(infoIdApiMajorVersion, &apiMajorVersion));
    FAIL_FAST_IF_FAILED(windowsUpdateAgentInfo->GetInfo(infoIdApiMinorVersion, &apiMinorVersion));
    FAIL_FAST_IF_FAILED(windowsUpdateAgentInfo->GetInfo(infoIdProductVersionString, &productVersionString));

    std::wcout << L"API Version: " << apiMajorVersion.intVal << L"." << apiMinorVersion.intVal << std::endl;
    std::wcout << L"Product Version String: "
        << wil_util::make_cotaskmem_string_from_variant_get_failfast(productVersionString).get() << std::endl;

    return 0;
}

参考