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.
Gdy aplikacja pobierze identyfikator obiektu (zobacz temat Wyliczanie zawartości) dla określonego obiektu, może ustawić jego właściwości, wywołując metody dostępne w interfejsach opisanych w poniższej tabeli.
| Interfejs | Opis |
|---|---|
| interfejs IPortableDeviceProperties | Służy do określania, czy można napisać daną właściwość i wysłać operację zapisu. |
| interfejs IPortableDeviceContent | Zapewnia dostęp do metod specyficznych dla zawartości. |
| interfejs IPortableDeviceValues | Służy do przechowywania wartości do zapisania, określania wyników operacji zapisu i pobierania atrybutów właściwości (podczas określania możliwości zapisu). |
Aplikacje najpierw tworzą kontener właściwości, który określa nowe wartości przy użyciu interfejsu IPortableDeviceValues . Po utworzeniu torby właściwości aplikacja ustawia te właściwości, wywołując metodę IPortableDeviceProperties::SetValues.
Funkcja WriteContentProperties w module ContentProperties.cpp przykładowej aplikacji pokazuje, jak aplikacja może ustawić nową właściwość nazwy obiektu dla wybranego obiektu.
Pierwszym zadaniem wykonanym przez funkcję WriteContentProperties jest monit użytkownika o wprowadzenie identyfikatora obiektu, dla którego aplikacja napisze nową nazwę.
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
WCHAR szNewObjectName[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceContent> 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(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting property reading\n");
}
Następnie aplikacja pobiera wartość WPD_PROPERTY_ATTRIBUTE_CAN_WRITE właściwości WPD_OBJECT_NAME, aby określić, czy właściwość można zapisać. (Pamiętaj, że aplikacja może ustawić dowolną właściwość, dla której wartość WPD_PROPERTY_ATTRIBUTE_CAN_WRITE ma wartość true).
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent interface
// to access the property-specific methods.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceProperties from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 3) Check the property attributes to see if we can write/change the WPD_OBJECT_NAME property.
if (SUCCEEDED(hr))
{
hr = pProperties->GetPropertyAttributes(szSelection,
WPD_OBJECT_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 the WPD_OBJECT_NAME reports TRUE\nThis means that the property can be changed/updated\n\n");
}
else
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for the WPD_OBJECT_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 from WPD_OBJECT_NAME on object '%ws', hr = 0x%lx\n",szSelection, hr);
}
}
}
Następnym krokiem jest poproszenie użytkownika o podanie nowego ciągu nazwy. (Zwróć uwagę, że wywołanie metody IPortableDeviceValues::SetStringValue powoduje jedynie utworzenie torby właściwości; rzeczywista właściwość nie została jeszcze zapisana).
if (bCanWrite)
{
printf("Enter the new WPD_OBJECT_NAME for the object '%ws'.\n>",szSelection);
hr = StringCbGetsW(szNewObjectName,sizeof(szNewObjectName));
if (FAILED(hr))
{
printf("An invalid object 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_PPV_ARGS(&pObjectPropertiesToWrite));
if (SUCCEEDED(hr))
{
if (pObjectPropertiesToWrite != NULL)
{
hr = pObjectPropertiesToWrite->SetStringValue(WPD_OBJECT_NAME, szNewObjectName);
if (FAILED(hr))
{
printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceValues, hr= 0x%lx\n", hr);
}
}
}
}
Na koniec do obiektu jest stosowana nowa wartość określona przez użytkownika.
if (SUCCEEDED(hr))
{
hr = pProperties->SetValues(szSelection, // 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", szSelection, hr);
}
else
{
printf("The WPD_OBJECT_NAME property on object '%ws' was written successfully (Read the properties again to see the updated value)\n", szSelection);
}
}
Tematy pokrewne
-
Interfejs IPortableDeviceKeyCollection
-
interfejs IPortableDeviceProperties
-
Interfejs IPortableDevicePropVariantCollection