IPortableDeviceServiceManager::GetDeviceServices 메서드(portabledeviceapi.h)
GetDeviceServices 메서드는 지정된 디바이스와 연결된 서비스 목록을 검색합니다.
구문
HRESULT GetDeviceServices(
[in] LPCWSTR pszPnPDeviceID,
[in] REFGUID guidServiceCategory,
[in, out] LPWSTR *pServices,
[in, out] DWORD *pcServices
);
매개 변수
[in] pszPnPDeviceID
디바이스의 플러그 앤 플레이(PnP) 식별자입니다.
[in] guidServiceCategory
검색할 서비스의 범주를 지정하는 GUID(Globally Unique Identifier)에 대한 참조입니다. 참조된 식별자가 GUID_DEVINTERFACE_WPD_SERVICE 경우 이 메서드는 디바이스에서 지원하는 모든 서비스를 검색합니다.
[in, out] pServices
문자열에 대한 사용자가 할당한 포인터 배열입니다. 메서드가 반환될 때 배열에는 검색된 PnP 서비스 식별자가 포함됩니다.
[in, out] pcServices
pServices 매개 변수로 지정된 배열의 요소 수입니다. 이 값은 검색할 최대 서비스 식별자 수를 나타냅니다. 메서드가 반환될 때 이 매개 변수에는 실제로 검색된 식별자 수가 포함됩니다.
반환 값
이 메서드는 HRESULT를 반환합니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.
반환 코드 | Description |
---|---|
|
메서드가 성공했습니다. |
|
pServices 매개 변수에서 참조하는 배열이 너무 작아서 모든 서비스를 포함할 수 없습니다. |
|
pcServices 매개 변수가 NULL이었습니다. |
설명
이 메서드가 성공하면 애플리케이션은 FreePortableDevicePnPIDs 함수를 호출하여 pServices 매개 변수에서 참조하는 배열을 해제해야 합니다.
애플리케이션은 IPortableDeviceManager::GetDevices 메서드를 호출하여 디바이스에 대한 PnP 식별자를 검색할 수 있습니다.
단일 스레드 아파트먼트를 사용하는 애플리케이션은 인터페이스 포인터 마샬링의 오버헤드를 없애기 때문에 CLSID_PortableDeviceServiceFTM 사용해야 합니다. CLSID_PortableDeviceService 여전히 레거시 애플리케이션에 지원됩니다.
예제
다음 예제에서는 모든 디바이스에 대한 서비스 목록을 검색하는 방법을 보여 줍니다.
#include "stdafx.h"
#include "atlbase.h"
#include "portabledeviceapi.h"
#include "portabledevice.h"
HRESULT GetServiceName( LPCWSTR pszPnpServiceID, LPWSTR* ppszServiceName);
HRESULT EnumerateServicesForDevice(
IPortableDeviceServiceManager* pPortableDeviceServiceManager,
LPCWSTR pszPnpDeviceID);
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = S_OK;
DWORD cPnPDeviceIDs = 0;
LPWSTR* pPnpDeviceIDs = NULL;
CComPtr<IPortableDeviceManager> pPortableDeviceManager;
CComPtr<IPortableDeviceServiceManager> pPortableDeviceServiceManager;
// Initialize COM for COINIT_MULTITHREADED
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// CoCreate the IPortableDeviceManager interface to enumerate
// portable devices and to get information about them.
if (hr == S_OK)
{
hr = CoCreateInstance(CLSID_PortableDeviceManager,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceManager,
(VOID**) &pPortableDeviceManager);
}
if (hr == S_OK)
{
// Get the PortableDeviceServiceManager interface
// by calling QueryInterface from IPortableDeviceManager
hr = pPortableDeviceManager->QueryInterface
(IID_IPortableDeviceServiceManager,
(VOID**) &pPortableDeviceServiceManager);
}
// Get the number of devices on the system
if (hr == S_OK)
{
hr = pPortableDeviceManager->GetDevices(NULL, &cPnPDeviceIDs);
}
// If we have at least 1 device,
// continue to query the list of services for each device
if ((hr == S_OK) && (cPnPDeviceIDs > 0))
{
pPnpDeviceIDs = new LPWSTR[cPnPDeviceIDs];
if (pPnpDeviceIDs != NULL)
{
hr = pPortableDeviceManager->GetDevices
(pPnpDeviceIDs, &cPnPDeviceIDs);
if (SUCCEEDED(hr))
{
for (DWORD dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
hr = EnumerateServicesForDevice
(pPortableDeviceServiceManager, pPnpDeviceIDs[dwIndex]);
}
}
// Free all returned PnPDeviceID strings
FreePortableDevicePnPIDs(pPnpDeviceIDs, cPnPDeviceIDs);
// Delete the array of LPWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;
}
}
return 0;
}
HRESULT EnumerateServicesForDevice(
IPortableDeviceServiceManager* pPortableDeviceServiceManager,
LPCWSTR pszPnpDeviceID)
{
HRESULT hr = S_OK;
DWORD cPnpServiceIDs = 0;
LPWSTR* pPnpServiceIDs = NULL;
if (pPortableDeviceServiceManager == NULL)
{
return E_POINTER;
}
// Get the number of services for the device
if (hr == S_OK)
{
hr = pPortableDeviceServiceManager->GetDeviceServices(
pszPnpDeviceID,
GUID_DEVINTERFACE_WPD_SERVICE, NULL, &cPnpServiceIDs);
}
// If we have at least 1, continue to gather information about
// each service and populate the device information array.
if ((hr == S_OK) && (cPnpServiceIDs > 0))
{
pPnpServiceIDs = new LPWSTR[cPnpServiceIDs];
if (pPnpServiceIDs != NULL)
{
// Get a list of all services on the given device.
// To query a give type of service (e.g. the Contacts Service),
// a service GUID can be provided here instead of
// GUID_DEVINTERFACE_WPD_SERVICE which returns all services
DWORD dwIndex = 0;
hr = pPortableDeviceServiceManager->GetDeviceServices
(pszPnpDeviceID, GUID_DEVINTERFACE_WPD_SERVICE,
pPnpServiceIDs, &cPnpServiceIDs);
if (SUCCEEDED(hr))
{
// For each service found, read the name property
for (dwIndex = 0; dwIndex < cPnpServiceIDs && SUCCEEDED(hr);
dwIndex++)
{
LPWSTR pszServiceName = NULL;
hr = GetServiceName(pPnpServiceIDs[dwIndex],
&pszServiceName);
CoTaskMemFree(pszServiceName);
}
}
FreePortableDevicePnPIDs(pPnpServiceIDs, cPnpServiceIDs);
// Delete the array of LPWSTR pointers
delete [] pPnpServiceIDs;
pPnpServiceIDs = NULL;
}
}
}
HRESULT GetServiceName( LPCWSTR pszPnpServiceID,
LPWSTR* ppszServiceName)
{
HRESULT hr = S_OK;
LPWSTR pszServiceID = NULL;
LPWSTR pszServiceObjectID = NULL;
CComPtr<IPortableDeviceValues> pClientInfo;
CComPtr<IPortableDeviceValues> pPropertyValues;
CComPtr<IPortableDeviceService> pService;
CComPtr<IPortableDeviceContent2> pContent;
CComPtr<IPortableDeviceProperties>pProperties;
CComPtr<IPortableDeviceKeyCollection> pPropertiesToRead;
hr = CoCreateInstance(CLSID_PortableDeviceServiceFTM,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceService,
(VOID**) &pService);
if (hr == S_OK)
{
// CoCreate an IPortableDeviceValues interface
// to hold the client information.
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) & pClientInfo);
if ((hr == S_OK) && (pClientInfo!= NULL))
{
hr = pClientInfo->SetStringValue
(WPD_CLIENT_NAME, L"Service Sample Application");
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_MAJOR_VERSION, 1);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_MINOR_VERSION, 0);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_REVISION, 0);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE,
SECURITY_IMPERSONATION);
}
if (hr == S_OK)
{
// Open a connection to the service
hr = pService->Open(pszPnpServiceID,
pClientInfo);
}
if (hr == S_OK)
{
hr = pService->GetServiceObjectID(&pszServiceID);
}
if (hr == S_OK)
{
hr = pService->Content(&pContent);
}
if (hr == S_OK)
{
hr = pContent->Properties(&pProperties);
}
// Create a IPortableDeviceKeyCollection
// containing the single PROPERTYKEY
if (hr == S_OK)
{
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceKeyCollection,
(VOID**) &pPropertiesToRead);
}
// Add our property key
if (hr == S_OK)
{
hr = pPropertiesToRead->Add(WPD_OBJECT_NAME);
}
if (hr == S_OK)
{
hr = pProperties->GetValues(
pszServiceID,
pPropertiesToRead, &pPropertyValues);
}
if (hr == S_OK)
{
hr = pPropertyValues->GetStringValue(
WPD_OBJECT_NAME, ppszServiceName);
}
CoTaskMemFree(pszServiceObjectID);
return hr;
}
}
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 7 [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | 지원되는 버전 없음 |
대상 플랫폼 | Windows |
헤더 | portabledeviceapi.h |
추가 정보