Recupero delle proprietà dell'oggetto WPD
I servizi spesso contengono oggetti figlio che appartengono a uno dei formati supportati da ogni servizio. Ad esempio, un servizio Contatti può supportare più oggetti contatto del formato Contatto astratto. Ogni oggetto contatto viene descritto dalle proprietà correlate (nome del contatto, numero di telefono, indirizzo di posta elettronica e così via).
L'applicazione WpdServiceApiSample include codice che illustra come un'applicazione può recuperare le proprietà dell'oggetto contenuto supportate da un determinato servizio Contatti. In questo esempio vengono usate le interfacce seguenti.
Interfaccia | Descrizione |
---|---|
IPortableDeviceService | Recupera l'interfaccia IPortableDeviceContent2 per accedere ai metodi di servizio supportati. |
IPortableDeviceContent2 | Fornisce l'accesso ai metodi specifici del contenuto. |
IPortableDeviceProperties | Recupera i valori della proprietà dell'oggetto. |
IPortableDeviceValues | Contiene i valori delle proprietà letti per tale oggetto. |
IPortableDeviceKeyCollection | Contiene i parametri per un determinato metodo. |
Quando l'utente sceglie l'opzione "7" nella riga di comando, l'applicazione richiama il metodo ReadContentProperties presente nel modulo ContentProperties.cpp.
Questo metodo recupera le quattro proprietà seguenti per l'oggetto contatto specificato.
Proprietà | Descrizione | PROPRIETÀKEY di Servizi dispositivo | WPD_PROPERTYKEY equivalenti |
---|---|---|---|
Identificatore dell'oggetto padre | Stringa che specifica l'identificatore per l'elemento padre dell'oggetto specificato. | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
Nome dell'oggetto | Stringa che specifica il nome dell'oggetto specificato | PKEY_GenericObj_Name | WPD_OBJECT_NAME |
Identificatore univoco permanente | Stringa che specifica un identificatore univoco per l'oggetto specificato. Questo identificatore è persistente tra le sessioni, a differenza dell'identificatore dell'oggetto. Per i servizi, deve essere una rappresentazione di stringa di un GUID. | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
Formato oggetto | Identificatore univoco globale (GUID) che specifica il formato del file corrispondente a un determinato oggetto | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- ID padre
- Nome
- PersistentUID
- Formato
Si noti che prima di recuperare le proprietà del contenuto, l'applicazione di esempio apre un servizio Contatti in un dispositivo connesso.
Il codice seguente per il metodo ReadContentProperties illustra come l'applicazione usa l'interfaccia IPortableDeviceContent2 per recuperare un'interfaccia IPortableDeviceProperties . Passando le proprietà PROPERTYKEYS delle proprietà richieste al metodo IPortableDeviceProperties::GetValues , ReadContentProperties recupera i valori richiesti e li visualizza nella finestra della console.
// Reads properties for the user specified object.
void ReadContentProperties(
IPortableDeviceService* pService)
{
if (pService == NULL)
{
printf("! A NULL IPortableDeviceService interface pointer was received\n");
return;
}
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceValues> pObjectProperties;
CComPtr<IPortableDeviceContent2> pContent;
CComPtr<IPortableDeviceKeyCollection> pPropertiesToRead;
// Prompt user to enter an object identifier on the device to read properties from.
printf("Enter the identifer of the object you wish to read properties from.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting property reading\n");
}
// 1) Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to
// access the content-specific methods.
if (SUCCEEDED(hr))
{
hr = pService->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr);
}
}
// 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent2 interface
// to access the property-specific methods.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceProperties from IPortableDeviceContent2, hr = 0x%lx\n",hr);
}
}
// 3) CoCreate an IPortableDeviceKeyCollection interface to hold the property keys
// we wish to read.
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPropertiesToRead));
if (SUCCEEDED(hr))
{
// 4) Populate the IPortableDeviceKeyCollection with the keys we wish to read.
// NOTE: We are not handling any special error cases here so we can proceed with
// adding as many of the target properties as we can.
if (pPropertiesToRead != NULL)
{
HRESULT hrTemp = S_OK;
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_ParentID);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_ParentID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_Name);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_Name to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_PersistentUID);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_PersistentUID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_ObjectFormat);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_ObjectFormat to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
}
}
// 5) Call GetValues() passing the collection of specified PROPERTYKEYs.
if (SUCCEEDED(hr))
{
hr = pProperties->GetValues(szSelection, // The object whose properties we are reading
pPropertiesToRead, // The properties we want to read
&pObjectProperties); // Driver supplied property values for the specified object
if (FAILED(hr))
{
printf("! Failed to get all properties for object '%ws', hr= 0x%lx\n", szSelection, hr);
}
}
// 6) Display the returned property values to the user
if (SUCCEEDED(hr))
{
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_ParentID, NAME_GenericObj_ParentID);
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_Name, NAME_GenericObj_Name);
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_PersistentUID, NAME_GenericObj_PersistentUID);
DisplayGuidProperty (pObjectProperties, PKEY_GenericObj_ObjectFormat, NAME_GenericObj_ObjectFormat);
}
}
Argomenti correlati