Pesquisa síncrona
O objeto Device Finder habilita pesquisas síncronas e assíncronas. As pesquisas síncronas são concluídas e retornam o controle para o aplicativo de chamada somente depois que todos os dispositivos disponíveis são encontrados. Para executar uma pesquisa síncrona, use um dos métodos de pesquisa síncronos da interface IUPnPDeviceFinder .
Observação
Pesquisas síncronas levam pelo menos nove segundos para serem retornadas. O atraso é causado porque a mensagem de pesquisa inicial do UDP deve ser enviada várias vezes. Essa duplicação é responsável pela não confiabilidade do protocolo de rede subjacente. Pesquisas síncronas são melhores para interfaces de linha de comando. Eles não são recomendados para interfaces gráficas do usuário.
O método IUPnPDeviceFinder::FindByType pesquisa por tipo de dispositivo ou serviço. Esse método usa um URI de tipo como um parâmetro de entrada e retorna uma coleção de objetos Device. Um objeto Device representa um dispositivo individual.
Os exemplos a seguir demonstram como executar uma pesquisa síncrona para dispositivos no VBScript. Cada script usa IUPnPDeviceFinder::FindByType, chamado com o URI do tipo (ID de serviço) para o tipo de dispositivo do player de mídia, urn:schemas-upnp-org:device:mediaplayer.v1.00.00. O método retorna uma coleção de objetos Device que corresponde aos dispositivos de player de mídia que foram encontrados. Para obter informações sobre como extrair objetos de dispositivo individuais de uma coleção, consulte Coleções de dispositivos retornadas por pesquisas síncronas.
Pesquisar dispositivos por tipo no VBScript
Dim deviceFinder
Set deviceFinder = CreateObject( "UPnP.UPnPDeviceFinder" )
Dim devices
Set devices = deviceFinder.FindByType( "urn:schemas-upnp-org:device:multidisk-dvd", 0 )
Pesquisar dispositivo por tipo em C++
O exemplo a seguir demonstra uma pesquisa síncrona para dispositivos media player usando C++. A função usa um ponteiro para a interface IUPnPDeviceFinder como entrada e retorna o ponteiro da interface IUPnPDevices .
O exemplo primeiro aloca um BSTR para representar o URI do tipo de dispositivo e, em seguida, passa isso para o método IUPnPDeviceFinder::FindByType . Ele também passa o endereço de um ponteiro IUPnPDevices local no buffer no qual o método armazena a coleção de dispositivos encontrados. Se a chamada de função for bem-sucedida, ela retornará o ponteiro para essa coleção.
#include <windows.h>
#include <upnp.h>
#include <stdio.h>
#pragma comment(lib, "oleaut32.lib")
IUPnPDevices *FindMediaPlayerDevices(IUPnPDeviceFinder *pDeviceFinder)
{
HRESULT hr = S_OK;
IUPnPDevices * pFoundDevices = NULL;
BSTR bstrTypeURI = NULL;
bstrTypeURI =
SysAllocString(L"urn:schemas-upnp-org:device:multidisk-dvd");
if (bstrTypeURI)
{
hr = pDeviceFinder->FindByType(bstrTypeURI,
0,
&pFoundDevices);
if (SUCCEEDED(hr))
{
wprintf(L"FindMediaPlayerDevices(): "
L"Search returned successfully\n");
}
else
{
fwprintf(stderr, L"FindMediaPlayerDevices(): "
L"FindByType search failed - returned "
L"HRESULT 0x%x\n",
hr);
pFoundDevices = NULL;
}
SysFreeString(bstrTypeURI);
}
else
{
fwprintf(stderr, L"FindMediaPlayerDevices(): "
L"Could not allocate BSTR for type URI\n");
}
return pFoundDevices;
}