Получение свойств объекта WPD
Службы часто содержат дочерние объекты, принадлежащие одному из форматов, поддерживаемых каждой службой. Например, служба контактов может поддерживать несколько объектов контакта в формате Абстрактный контакт. Каждый объект контакта описывается связанными свойствами (имя контакта, номер телефона, адрес электронной почты и т. д.).
Приложение WpdServiceApiSample содержит код, демонстрирующий, как приложение может получить свойства объекта содержимого, поддерживаемые данной службой контактов. В этом примере используются следующие интерфейсы.
Интерфейс | Описание |
---|---|
IPortableDeviceService | Извлекает интерфейс IPortableDeviceContent2 для доступа к поддерживаемым методам службы. |
IPortableDeviceContent2 | Предоставляет доступ к методам, зависящим от содержимого. |
IPortableDeviceProperties | Извлекает значения свойств объекта. |
IPortableDeviceValues | Содержит значения свойств, которые были прочитаны для этого объекта. |
IPortableDeviceKeyCollection | Содержит параметры для заданного метода. |
Когда пользователь выбирает параметр "7" в командной строке, приложение вызывает метод ReadContentProperties , который находится в модуле ContentProperties.cpp.
Этот метод извлекает следующие четыре свойства для указанного объекта contact.
Свойство | Описание | Ключ propertykey служб устройств | Эквивалентные WPD_PROPERTYKEY |
---|---|---|---|
Идентификатор родительского объекта | Строка, указывающая идентификатор родительского объекта. | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
Имя объекта | Строка, указывающая имя заданного объекта. | PKEY_GenericObj_Name | WPD_OBJECT_NAME |
Постоянный уникальный идентификатор | Строка, задающая уникальный идентификатор для заданного объекта. Этот идентификатор сохраняется в разных сеансах, в отличие от идентификатора объекта. Для служб это должно быть строковое представление GUID. | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
Формат объекта | Глобальный уникальный идентификатор (GUID), указывающий формат файла, соответствующего заданному объекту. | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- Родительский идентификатор
- Имя
- PersistentUID
- Формат
Обратите внимание, что перед получением свойств содержимого пример приложения открывает службу контактов на подключенном устройстве.
В следующем коде для метода ReadContentProperties показано, как приложение использует интерфейс IPortableDeviceContent2 для получения интерфейса IPortableDeviceProperties . Передав свойства PROPERTYKEYS запрошенных свойств в метод IPortableDeviceProperties::GetValues , ReadContentProperties извлекает запрошенные значения, а затем отображает их в окне консоли.
// 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);
}
}
Связанные темы