Metodo IPortableDeviceServiceManager::GetDeviceServices (portabledeviceapi.h)
Il metodo GetDeviceServices recupera un elenco dei servizi associati al dispositivo specificato.
Sintassi
HRESULT GetDeviceServices(
[in] LPCWSTR pszPnPDeviceID,
[in] REFGUID guidServiceCategory,
[in, out] LPWSTR *pServices,
[in, out] DWORD *pcServices
);
Parametri
[in] pszPnPDeviceID
Identificatore Plug and Play (PnP) del dispositivo.
[in] guidServiceCategory
Riferimento a un identificatore univoco globale (GUID) che specifica la categoria di servizi da recuperare. Se l'identificatore a cui si fa riferimento è GUID_DEVINTERFACE_WPD_SERVICE, questo metodo recupererà tutti i servizi supportati dal dispositivo.
[in, out] pServices
Matrice allocata dall'utente di puntatori a stringhe. Al termine del metodo, la matrice contiene gli identificatori del servizio PnP recuperati.
[in, out] pcServices
Numero di elementi nella matrice specificata dal parametro pServices . Questo valore rappresenta il numero massimo di identificatori del servizio che verranno recuperati. Al termine del metodo, questo parametro contiene il numero di identificatori effettivamente recuperati.
Valore restituito
Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.
Codice restituito | Descrizione |
---|---|
|
Il metodo è riuscito. |
|
La matrice a cui fa riferimento il parametro pServices era troppo piccola per contenere tutti i servizi. |
|
Il parametro pcServices è NULL. |
Commenti
Se questo metodo ha esito positivo, l'applicazione deve chiamare la funzione FreePortableDevicePnPIDs per liberare la matrice a cui fa riferimento il parametro pServices .
Un'applicazione può recuperare l'identificatore PnP per un dispositivo chiamando il metodo IPortableDeviceManager::GetDevices .
Le applicazioni che usano apartment a thread singolo devono usare CLSID_PortableDeviceServiceFTM in quanto elimina il sovraccarico del marshalling del puntatore di interfaccia. CLSID_PortableDeviceService è ancora supportato per le applicazioni legacy.
Esempio
Nell'esempio seguente viene illustrato come recuperare un elenco di servizi per tutti i dispositivi.
#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;
}
}
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 7 [app desktop | App UWP] |
Server minimo supportato | Nessuno supportato |
Piattaforma di destinazione | Windows |
Intestazione | portabledeviceapi.h |
Vedi anche