Recuperación de propiedades de objeto WPD
Los servicios suelen contener objetos secundarios que pertenecen a uno de los formatos que admite cada servicio. Por ejemplo, un servicio de contactos puede admitir varios objetos de contacto del formato De contacto abstracto. Cada objeto de contacto se describe mediante propiedades relacionadas (nombre de contacto, número de teléfono, dirección de correo electrónico, etc.).
La aplicación WpdServiceApiSample incluye código que muestra cómo una aplicación puede recuperar las propiedades de objeto de contenido compatibles con un servicio contacts determinado. En este ejemplo se usan las siguientes interfaces.
Interfaz | Descripción |
---|---|
IPortableDeviceService | Recupera la interfaz IPortableDeviceContent2 para acceder a los métodos de servicio admitidos. |
IPortableDeviceContent2 | Proporciona acceso a los métodos específicos del contenido. |
IPortableDeviceProperties | Recupera los valores de propiedad del objeto. |
IPortableDeviceValues | Contiene los valores de propiedad leídos para ese objeto. |
IPortableDeviceKeyCollection | Contiene los parámetros de un método determinado. |
Cuando el usuario elige la opción "7" en la línea de comandos, la aplicación invoca el método ReadContentProperties que se encuentra en el módulo ContentProperties.cpp.
Este método recupera las cuatro propiedades siguientes para el objeto de contacto especificado.
Propiedad | Descripción | Device Services PROPERTYKEY | WPD_PROPERTYKEY equivalente |
---|---|---|---|
Identificador de objeto primario | Cadena que especifica el identificador del elemento primario del objeto especificado. | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
Nombre del objeto | Cadena que especifica el nombre del objeto especificado. | PKEY_GenericObj_Name | WPD_OBJECT_NAME |
Identificador único persistente | Cadena que especifica un identificador único para el objeto especificado. Este identificador es persistente entre sesiones, a diferencia del identificador de objeto. En el caso de los servicios, debe ser una representación de cadena de un GUID. | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
Formato de objeto | Identificador único global (GUID) que especifica el formato del archivo correspondiente a un objeto determinado. | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- Id. primario
- NOMBRE
- PersistentUID
- Formato
Tenga en cuenta que antes de recuperar las propiedades de contenido, la aplicación de ejemplo abre un servicio contactos en un dispositivo conectado.
El código siguiente para el método ReadContentProperties muestra cómo la aplicación usa la interfaz IPortableDeviceContent2 para recuperar una interfaz IPortableDeviceProperties . Al pasar las propiedades PROPERTYKEYS de las propiedades solicitadas al método IPortableDeviceProperties::GetValues , ReadContentProperties recupera los valores solicitados y, a continuación, los muestra en la ventana de la consola.
// 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);
}
}
Temas relacionados