Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Usługi często zawierają obiekty podrzędne należące do jednego z formatów obsługiwanych przez każdą usługę. Na przykład usługa Kontakty może obsługiwać wiele obiektów kontaktowych w formacie abstrakcyjnego kontaktu. Każdy obiekt kontaktu jest opisywany przez powiązane właściwości (imię i nazwisko kontaktu, numer telefonu, adres e-mail itd.).
Aplikacja WpdServiceApiSample zawiera kod, który pokazuje, jak aplikacja może pobrać właściwości obiektu zawartości obsługiwane przez daną usługę Kontakty. W tym przykładzie użyto następujących interfejsów.
| Interfejs | Opis |
|---|---|
| IPortableDeviceService | Pobiera interfejs IPortableDeviceContent2, aby uzyskać dostęp do obsługiwanych metod usługi. |
| IPortableDeviceContent2 | Zapewnia dostęp do metod specyficznych dla zawartości. |
| IPortableDeviceProperties | Pobiera wartości właściwości obiektu. |
| IPortableDeviceValues | Przechowuje wartości właściwości odczytane dla tego obiektu. |
| IPortableDeviceKeyCollection | Zawiera parametry dla danej metody. |
Gdy użytkownik wybierze opcję "7" w wierszu polecenia, aplikacja wywołuje ReadContentProperties metodę znajdującą się w module ContentProperties.cpp.
Ta metoda pobiera następujące cztery właściwości określonego obiektu kontaktu.
| Własność | Opis | Usługi Urządzenia PROPERTYKEY | Równoważnik WPD_PROPERTYKEY |
|---|---|---|---|
| Identyfikator obiektu nadrzędnego | Ciąg określający identyfikator obiektu nadrzędnego danego obiektu. | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
| Nazwa obiektu | Ciąg określający nazwę danego obiektu | PKEY_GenericObj_Name (Ogólna_Nazwa_Obiektu) | WPD_OBJECT_NAME |
| Trwały unikatowy identyfikator | Ciąg określający unikatowy identyfikator danego obiektu. Ten identyfikator jest trwały między sesjami, w przeciwieństwie do identyfikatora obiektu. W przypadku usług, musi to być reprezentacja GUID w formie ciągu znaków. | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
| Format obiektu | Unikatowy identyfikator globalny (GUID), który określa format pliku odpowiadającego określonemu obiektowi | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- Identyfikator nadrzędny
- Nazwa
- Trwały identyfikator UID
- Format
Pamiętaj, że przed pobraniem właściwości zawartości przykładowa aplikacja otwiera usługę Kontakty na połączonym urządzeniu.
Poniższy kod metody ReadContentProperties demonstruje, jak aplikacja używa interfejsu IPortableDeviceContent2 do uzyskania interfejsu IPortableDeviceProperties. Przekazując właściwość PROPERTYKEYS żądanych właściwości do IPortableDeviceProperties::GetValues method, ReadContentProperties pobiera żądane wartości, a następnie wyświetla je w oknie konsoli.
// 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 identifier 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);
}
}
Tematy pokrewne