Поделиться через


Получение объектов службы

Объекты устройства предоставляют свойство Службы , которое возвращает коллекцию объектов Service, которая содержит по одному объекту службы для каждой службы, экспортируемой устройством. Приложения могут последовательно просматривать эту коллекцию или запрашивать определенную службу, используя ее идентификатор службы.

Пример VBScript

Ниже приведен пример кода VBScript, который извлекает объекты service для двух служб, экспортированных устройством.

' Get the service objects
services = device.Services
    
Set appService = services( "urn:upnp-org:serviceId:DVDVideo" )
Set xportService = services( "urn:upnp-org:serviceId:AVTransport" )

Первая строка извлекает коллекцию служб из объекта Device, запрашивая свойство Services . Следующие две строки получают два требуемых объекта Service из коллекции, указывая их идентификаторы служб. Коллекция служб также может быть последовательно пройдена с помощью для каждого ... следующий цикл.

Пример C++

В следующем примере показан код C++, необходимый для получения объектов Service с устройства. Сначала пример кода запрашивает свойство IUPnPDevice::Services в интерфейсе, переданном в функцию. При этом возвращается коллекция служб с помощью интерфейса IUPnPServices . Чтобы получить отдельные объекты Service, используйте метод Item и укажите запрошенные идентификаторы служб. Для последовательного обхода коллекции используйте методы IEnumVARIANT::Reset, IEnumVARIANT::Next и IEnumVARIANT::Skip . Этот пример аналогичен примеру, используемому для обхода коллекции IUPnPDevices .

#include <windows.h>
#include <upnp.h>

#pragma comment(lib, "oleaut32.lib")


HRESULT ExtractServices(IUPnPDevice * pDevice)
{
    // Create a BSTR to hold the service name
    BSTR bstrServiceName = SysAllocString(L"urn:upnp-org:servicId:DVDVideo");
    if (NULL == bstrServiceName)
    {
        return E_OUTOFMEMORY;
    }
    // Get the list of services available on the device
    IUPnPServices * pServices = NULL;
    HRESULT hr = pDevice->get_Services(&pServices);
    if (SUCCEEDED(hr))
    {
        // Retrieve the service we are interested in
        IUPnPService * pAppService = NULL;
        hr = pServices->get_Item(bstrServiceName, &pAppService);
        if (SUCCEEDED(hr))
        {
            // Do something interesting with the service object
            pAppService->Release();
        }
        pServices->Release();
    }
    SysFreeString(bstrServiceName);
    return hr;
}