デバイスの説明
デバイス オブジェクトを取得するには、次の 2 つの方法があります。
- IUPnPDescriptionDocument インターフェイスの使用。 IUPnPDescriptionDocument インターフェイスは、スクリプト作成に安全な唯一のインターフェイスです。
- IUPnPDeviceFinder インターフェイスを使用して IUPnPDevices インターフェイスを取得します。
どちらのメソッドも Devices コレクションを返します。 その後、アプリケーションは Device メソッドを使用して、デバイスに関するプロパティを取得します。
アプリケーションは、次の種類の情報を取得できます。
- ルート デバイス、親デバイス、子デバイスなどのデバイス階層情報。
- UDN、Uniform Resource Identifier (URI)、およびユーザーが読み取り可能な名前を含むデバイス プロパティ。
- 名前や関連する Web ページを含む製造元情報。
- モデル情報(名前、番号、UPC、シリアル番号、デバイスの説明など)。
- デバイスを制御する URL や、アイコンのダウンロード元の URL など、情報を表示します。
- 特定のデバイスによって提供されるサービス。
アプリケーションは、 IUPnPDeviceDocumentAccess インターフェイスを使用して、デバイス記述ドキュメントの URL も取得します。 その後、アプリケーションは説明ドキュメントを読み込み、 IUPnPDevice インターフェイスによって公開されていないデバイスとサービスのプロパティを操作します。 このインターフェイスは既定のインターフェイスではないので、スクリプトでは使用できません。
Visual Basic の例
次のサンプル コードは、 IUPnPDeviceDocumentAccess::GetDocumentURL の使用方法を示しています。
Sub GetDocumentURL()
Dim pDescDoc As IUPnPDeviceDocumentAccess
Dim strDescDocURL As String
'currentDevice is UPnPDevice object containing the current UPnP Device
'We are trying to get IUPnPDeviceDocumentAccess interface in the UPnP Device object
Set pDescDoc = currentDevice
If Not (pDescDoc is Nothing) Then
'Description Document URL is got from device
strDescDocURL = pDescDoc.GetDocumentURL
End If
C++ の例
次のサンプル コードは、 IUPnPDeviceDocumentAccess::GetDocumentURL の使用方法を示しています。
#include <windows.h>
#include <upnp.h>
#include <stdio.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
int GetDeviceDocumentUrl ()
{
HRESULT hr = S_OK;
// List of interfaces needed
IUPnPDeviceFinder *pDevFinder=NULL;
IUPnPDevice *pDevice =NULL;
IUPnPDeviceDocumentAccess* pDeviceDocument=NULL;
BSTR bstrDeviceUDN =NULL;
BSTR bstrDeviceDocumentURL = NULL;
bstrDeviceUDN = SysAllocString(L"uuid:234324234324");
if(bstrDeviceUDN == NULL){
printf("ERROR: Could not allocate memory\n");
return -1;
}
//CoInitialize the program so that we can create COM objects
CoInitializeEx(NULL, COINIT_MULTITHREADED);
//now try to instantiate the DeviceFinder object
hr = CoCreateInstance( CLSID_UPnPDeviceFinder,
NULL,
CLSCTX_INPROC_SERVER,
IID_IUPnPDeviceFinder,
(LPVOID *) &pDevFinder);
if(!SUCCEEDED(hr)){
printf("\nERROR: CoCreateInstance on IUPnPDeviceFinder returned HRESULT %x",hr);
goto cleanup;
}
printf("\nGot a pointer to the IUPnPDeviceFinder Interface");
printf("\n Finding the device of given UDN\n");
hr =pDevFinder->FindByUDN(bstrDeviceUDN, &pDevice);
if(hr!=S_OK)
{
printf("\nERROR: FindByUDN for %S returned HRESULT %x", bstrDeviceUDN, hr);
goto cleanup;
}
printf("\n\tFindByUDN for device of UDN %S succeeded", bstrDeviceUDN);
//Now query pDevice for IUPnPDeviceDocumentAccess
hr = pDevice->QueryInterface(IID_IUPnPDeviceDocumentAccess, (VOID **)&pDeviceDocument);
if(SUCCEEDED(hr)){
// We have got a pointer to the IUPnPDeviceDocumentAccess interface.
// GetDocumentURL is available only in Windows XP.
hr = pDeviceDocument->GetDocumentURL(&bstrDeviceDocumentURL);
if(SUCCEEDED(hr))
printf("\nThe Device Document URL is %S \n", bstrDeviceDocumentURL);
}
cleanup:
//release references to all interfaces
if(pDevFinder)
pDevFinder->Release();
if(pDevice)
pDevice->Release();
if(pDeviceDocument)
pDeviceDocument->Release();
// Free the bstr strings
if(bstrDeviceDocumentURL)
SysFreeString(bstrDeviceDocumentURL);
if(bstrDeviceUDN)
SysFreeString(bstrDeviceUDN);
CoUninitialize();
return 0;
}