Удаление содержимого с устройства
Другой распространенной операцией, выполняемой приложением WPD, является удаление содержимого из расположения на устройстве.
Операции удаления содержимого выполняются с помощью интерфейсов, описанных в следующей таблице.
Интерфейс | Описание |
---|---|
Интерфейс IPortableDeviceContent | Предоставляет доступ к методам удаления содержимого. |
Интерфейс IPortableDevicePropVariantCollection | Предоставляет доступ к методам, зависящим от свойств. |
Функция DeleteContentFromDevice в модуле ContentTransfer.cpp примера приложения демонстрирует, как приложение может удалить содержимое на устройстве. Операции удаления содержимого очень похожи на операции передачи содержимого. Одно отличие заключается в том, что во время удаления приложение вызывает IPortableDeviceContent::D elete , а не IPortableDeviceContent::Move. (Описание задач, предшествующих вызову метода Delete, см. в разделе Перемещение содержимого на устройстве .)
void DeleteContentFromDevice(
IPortableDevice* pDevice)
{
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToDelete;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToDelete;
if (pDevice == NULL)
{
printf("! A NULL IPortableDevice interface pointer was received\n");
return;
}
// Prompt user to enter an object identifier on the device to delete.
printf("Enter the identifer of the object you wish to delete.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting content deletion\n");
}
// 1) get an IPortableDeviceContent interface from the IPortableDevice interface to
// access the content-specific methods.
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 2) CoCreate an IPortableDevicePropVariantCollection interface to hold the object identifiers
// to delete.
//
// NOTE: This is a collection interface so more than 1 object can be deleted at a time.
// This sample only deletes a single object.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pObjectsToDelete));
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
// PWSTR value. This memory will be freed when PropVariantClear() is
// called below.
pv.vt = VT_LPWSTR;
pv.pwszVal = AtlAllocTaskWideString(szSelection);
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", szSelection);
}
// 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", szSelection);
}
}
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);
}
}
else
{
printf("! Failed to CoCreateInstance CLSID_PortableDevicePropVariantCollection, hr = 0x%lx\n",hr);
}
}
}
Связанные темы