Compartir a través de


Establecer propiedades para un único objeto

Después de que la aplicación recupere un identificador de objeto (vea el tema Enumerating Content ) para un objeto determinado, puede establecer propiedades para ese objeto llamando a métodos en las interfaces descritas en la tabla siguiente.

Interfaz Descripción
IPortableDeviceProperties (interfaz) Se usa para determinar si se puede escribir una propiedad determinada y enviar la operación de escritura.
IPortableDeviceContent (Interfaz) Proporciona acceso a los métodos específicos del contenido.
IPortableDeviceValues (Interfaz) Se usa para contener los valores que se van a escribir, determinar los resultados de la operación de escritura y recuperar atributos de propiedades (al determinar la funcionalidad de escritura).

 

Las aplicaciones establecen propiedades en un objeto creando primero un contenedor de propiedades que especifica los nuevos valores mediante la interfaz IPortableDeviceValues. Una vez creado el contenedor de propiedades, una aplicación establece esas propiedades llamando al método IPortableDeviceProperties::SetValues .

La WriteContentProperties función del módulo ContentProperties.cpp de la aplicación de ejemplo muestra cómo una aplicación podría establecer una nueva propiedad de nombre de objeto para un objeto seleccionado.

La primera tarea realizada por la WriteContentProperties función es pedir al usuario que escriba un identificador de objeto para el objeto para el que la aplicación escribirá el nuevo nombre.

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");
}

Después de esto, la aplicación recupera el valor WPD_PROPERTY_ATTRIBUTE_CAN_WRITE de la propiedad WPD_OBJECT_NAME para determinar si la propiedad se puede escribir. (Tenga en cuenta que la aplicación podría establecer cualquier propiedad para la que el valor de WPD_PROPERTY_ATTRIBUTE_CAN_WRITE sea 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);
        }
    }
}

El siguiente paso consiste en solicitar al usuario la nueva cadena de nombre. (Tenga en cuenta que la llamada al método IPortableDeviceValues::SetStringValue simplemente crea el contenedor de propiedades; la propiedad real aún no se ha escrito).

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);
                }
            }
        }
    }

Por último, el nuevo valor, especificado por el usuario, se aplica al objeto .

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);
    }
}

IPortableDevice (interfaz)

IPortableDeviceContent (Interfaz)

IPortableDeviceKeyCollection (Interfaz)

IPortableDeviceProperties (interfaz)

IPortableDevicePropertiesBulk (Interfaz)

IPortableDevicePropVariantCollection (Interfaz)

Guía de programación