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, które należą do jednego z formatów obsługiwanych przez poszczególną usługę. Na przykład usługa Kontakty może obsługiwać wiele obiektów kontaktów 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 WpdServicesApiSample zawiera kod, który pokazuje, jak aplikacja może zaktualizować właściwość nazwy dla obiektu podrzędnego danej usługi Kontakty. W tym przykładzie użyto następujących interfejsów WPD.
| Interfejs | Opis |
|---|---|
| IPortableDeviceService | Służy do pobierania interfejsu IPortableDeviceContent2 w celu uzyskania dostępu do obsługiwanych metod usługi. |
| IPortableDeviceContent2 | Zapewnia dostęp do metod specyficznych dla zawartości. |
| IPortableDeviceProperties | Służy do zapisywania wartości właściwości obiektu i określania, czy można zapisać daną właściwość |
| IPortableDeviceValues | Służy do przechowywania wartości właściwości do zapisania, określania wyników operacji zapisu i pobierania atrybutów właściwości (podczas określania możliwości zapisu). |
Gdy użytkownik wybierze opcję "8" w wierszu polecenia, aplikacja wywołuje metodę WriteContentProperties znalezioną w module ContentProperties.cpp. Ta metoda monituje użytkownika o wprowadzenie identyfikatora obiektu, który ma zostać zaktualizowany. Użytkownik identyfikuje obiekt, a metoda monituje użytkownika o podanie nowej nazwy. Po określeniu tej nazwy metoda aktualizuje właściwość Name dla danego obiektu.
Pamiętaj, że przed zapisaniem właściwości obiektu przykładowa aplikacja otwiera usługę Kontakty na połączonym urządzeniu.
Poniższy kod metody WriteContentProperties pokazuje, jak aplikacja używa interfejsu IPortableDeviceContent2 w celu pobrania interfejsu IPortableDeviceProperties. Przekazując klucze własności żądanych właściwości do metody IPortableDeviceProperties::SetValues, WriteContentProperties aktualizuje właściwość name.
void WriteContentProperties(
IPortableDeviceService* pService)
{
if (pService == NULL)
{
printf("! A NULL IPortableDeviceService interface pointer was received\n");
return;
}
HRESULT hr = S_OK;
WCHAR wszSelection[81] = {0};
WCHAR wszNewObjectName[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceContent2> pContent;
CComPtr<IPortableDeviceValues> pObjectPropertiesToWrite;
CComPtr<IPortableDeviceValues> pPropertyWriteResults;
CComPtr<IPortableDeviceValues> pAttributes;
BOOL bCanWrite = FALSE;
// Prompt user to enter an object identifier on the device to write properties on.
printf("Enter the identifer of the object you wish to write properties on.\n>");
hr = StringCbGetsW(wszSelection,sizeof(wszSelection));
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) Check the property attributes to see if we can write/change the NAME_GenericObj_Name property.
if (SUCCEEDED(hr))
{
hr = pProperties->GetPropertyAttributes(wszSelection,
PKEY_GenericObj_Name,
&pAttributes);
if (SUCCEEDED(hr))
{
hr = pAttributes->GetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, &bCanWrite);
if (SUCCEEDED(hr))
{
if (bCanWrite)
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for PKEY_GenericObj_Name reports TRUE\nThis means that the property can be changed/updated\n\n");
}
else
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for PKEY_GenericObj_Name reports FALSE\nThis means that the property cannot be changed/updated\n\n");
}
}
else
{
printf("! Failed to get the WPD_PROPERTY_ATTRIBUTE_CAN_WRITE value for PKEY_GenericObj_Name on object '%ws', hr = 0x%lx\n", wszSelection, hr);
}
}
}
// 4) Prompt the user for the new value of the NAME_GenericObj_Name property only if the property attributes report
// that it can be changed/updated.
if (bCanWrite)
{
printf("Enter the new PKEY_GenericObj_Name property for the object '%ws'.\n>",wszSelection);
hr = StringCbGetsW(wszNewObjectName,sizeof(wszNewObjectName));
if (FAILED(hr))
{
printf("An invalid PKEY_GenericObj_Name was specified, aborting property writing\n");
}
// 5) CoCreate an IPortableDeviceValues interface to hold the property values
// we wish to write.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) &pObjectPropertiesToWrite);
if (SUCCEEDED(hr))
{
if (pObjectPropertiesToWrite != NULL)
{
hr = pObjectPropertiesToWrite->SetStringValue(PKEY_GenericObj_Name, wszNewObjectName);
if (FAILED(hr))
{
printf("! Failed to add PKEY_GenericObj_Name to IPortableDeviceValues, hr= 0x%lx\n", hr);
}
}
}
}
// 6) Call SetValues() passing the collection of specified PROPERTYKEYs.
if (SUCCEEDED(hr))
{
hr = pProperties->SetValues(wszSelection, // The object whose properties we are reading
pObjectPropertiesToWrite, // The properties we want to read
&pPropertyWriteResults); // Driver supplied property result values for the property read operation
if (FAILED(hr))
{
printf("! Failed to set properties for object '%ws', hr= 0x%lx\n", wszSelection, hr);
}
else
{
printf("The PKEY_GenericObj_Name property on object '%ws' was written successfully (Read the properties again to see the updated value)\n", wszSelection);
}
}
}
}
Tematy pokrewne