CoEnumUPnPDevices

#include <upnp.h>

HRESULT CoEnumUPnPDevices(VOID)
{
    HRESULT Result;
    IUPnPDeviceFinder* Finder = NULL;
    IUPnPDevices* Devices = NULL;
    BSTR UPnPType = NULL;
    IUnknown* Enum = NULL;
    IEnumVARIANT* EnumVariant = NULL;
    VARIANT UPnPObject; VariantInit(&UPnPObject);

    Result = CoInitialize(NULL);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = CoCreateInstance(CLSID_UPnPDeviceFinder, NULL, CLSCTX_INPROC_SERVER, IID_IUPnPDeviceFinder, (PVOID*)&Finder);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    UPnPType = SysAllocString(L"ssdp:all");
    if (UPnPType == NULL)
        goto EXIT_ROUTINE;

    Result = Finder->FindByType(UPnPType, 0, &Devices);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Devices->get__NewEnum(&Enum);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Enum->QueryInterface(IID_IEnumVARIANT, (PVOID*)&EnumVariant);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    while (EnumVariant->Next(1, &UPnPObject, NULL) == S_OK)
    {
        IUPnPDevice* DeviceObject = (IUPnPDevice*)UPnPObject.pdispVal;
        
        /*
            Stuff to do goes here....
            https://learn.microsoft.com/en-us/windows/win32/api/upnp/nn-upnp-iupnpdevice
            callback routine, or something, whatever
        */

        //EXAMPLE
        BSTR FriendlyName = 0;
        DeviceObject->get_FriendlyName(&FriendlyName); //FriendlyName is BSTR, which is OLECHAR* which is just WCHAR lol
        //EXAMPLE END

        if (DeviceObject)
            DeviceObject->Release();

        if (UPnPObject.vt != VT_EMPTY)
            VariantClear(&UPnPObject);
    }

EXIT_ROUTINE:

    if (UPnPObject.vt != VT_EMPTY)
        VariantClear(&UPnPObject);

    if (UPnPType != NULL)
        SysFreeString(UPnPType);

    if (EnumVariant)
        EnumVariant->Release();

    if (Devices)
        Devices->Release();

    if (Finder)
        Finder->Release();

    CoUninitialize();

    return Result;
}

Last updated