Share via


Deleting Content from the Device

banner art

Previous Next

Deleting Content from the Device

Another common operation accomplished by a WPD application is the deletion of content from a location on the device.

Content deletion operations are accomplished using the interfaces described in the following table.

Interface Description
IPortableDeviceContent Interface Provides access to the content deletion methods.
IPortableDevicePropVariantCollection Interface Provides access to property-specific methods.

The DeleteContentFromDevice function in the sample application's ContentTransfer.cpp module demonstrates how an application could delete content on the device. Content deletion operations are very similar to content-transfer operations. The one difference is that during a deletion, the application calls IPortableDeviceContent::Delete rather than IPortableDeviceContent::Move. (See the Moving Content on the Device topic for a description of the tasks leading up to calling the Delete method.)

HRESULT                                       hr               = S_OK;
WCHAR                                         wszSelection[81] = {0};
CComPtr<IPortableDeviceContent>               pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToDelete;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToDelete;
    if (SUCCEEDED(hr))
    {
        if (pObjectsToDelete != NULL)
        {
            PROPVARIANT pv = {0};
            PropVariantInit(&pv;);

            // Initialize a PROPVARIANT structure with the object identifier string
            // that the user selected above. Notice we are allocating memory for the
            // LPWSTR value.  This memory will be freed when PropVariantClear() is
            // called below.
            pv.vt      = VT_LPWSTR;
            pv.pwszVal = AtlAllocTaskWideString(wszSelection);
            if (pv.pwszVal != NULL)
            {
                // Add the object identifier to the objects-to-delete list
                // (We are only deleting 1 in this example)
                hr = pObjectsToDelete->Add(&pv;);
                if (SUCCEEDED(hr))
                {
                    // Attempt to delete the object from the device
                    hr = pContent->Delete(PORTABLE_DEVICE_DELETE_NO_RECURSION,  // Deleting with no recursion
                                          pObjectsToDelete,                     // Object(s) to delete
                                          NULL);                                // Object(s) that failed to delete (we are only deleting 1, so we can pass NULL here)
                    if (SUCCEEDED(hr))
                    {
                        // An S_OK return lets the caller know that the deletion was successful
                        if (hr == S_OK)
                        {
                            printf("The object '%ws' was deleted from the device.\n", wszSelection);
                        }

                        // An S_FALSE return lets the caller know that the deletion failed.
                        // The caller should check the returned IPortableDevicePropVariantCollection
                        // for a list of object identifiers that failed to be deleted.
                        else
                        {
                            printf("The object '%ws' failed to be deleted from the device.\n", wszSelection);
                        }
                    }
                    else
                    {
                        printf("! Failed to delete an object from the device, hr = 0x%lx\n",hr);
                    }
                }
                else
                {
                    printf("! Failed to delete an object from the device because we could no add the object identifier string to the IPortableDevicePropVariantCollection, hr = 0x%lx\n",hr);
                }
            }
            else
            {
                hr = E_OUTOFMEMORY;
                printf("! Failed to delete an object from the device because we could no allocate memory for the object identifier string, hr = 0x%lx\n",hr);
            }

            // Free any allocated values in the PROPVARIANT before exiting
            PropVariantClear(&pv;);
        }
        else
        {
            printf("! Failed to delete an object from the device because we were returned a NULL IPortableDevicePropVariantCollection interface pointer, hr = 0x%lx\n",hr);
        }
    }

See Also

Previous Next