Spostamento del contenuto nel dispositivo
Un'altra operazione comune eseguita da un'applicazione WPD è il trasferimento di contenuto da una posizione nel dispositivo a un'altra.
Le operazioni di spostamento del contenuto vengono eseguite usando le interfacce descritte nella tabella seguente.
Interfaccia | Descrizione |
---|---|
Interfaccia IPortableDeviceContent | Fornisce l'accesso ai metodi specifici del contenuto. |
Interfaccia IPortableDevicePropVariantCollection | Fornisce l'accesso ai metodi specifici della proprietà. |
La funzione MoveContentAlreadyOnDevice nel modulo ContentTransfer.cpp dell'applicazione di esempio illustra come un'applicazione può spostare il contenuto da una posizione a un'altra.
La prima attività eseguita dalla funzione MoveContentAlreadyOnDevice consiste nell'eseguire una query sul driver di dispositivo per verificare se supporta lo spostamento del contenuto. Questa operazione viene eseguita chiamando la funzione helper SupportsCommand e passando WPD_COMMAND_OBJECT_MANAGEMENT_MOVE_OBJECTS come secondo argomento.
HRESULT hr = S_OK;
WCHAR wszSelection[81] = {0};
WCHAR wszDestinationFolderObjectID[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToMove;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToMove;
if (SupportsCommand(pDevice, WPD_COMMAND_OBJECT_MANAGEMENT_MOVE_OBJECTS) == FALSE)
{
printf("! This device does not support the move operation (i.e. The WPD_COMMAND_OBJECT_MANAGEMENT_MOVE_OBJECTS command)\n");
return;
}
Il passaggio successivo comporta la richiesta all'utente di immettere due identificatori di oggetto. Il primo è l'identificatore per il contenuto che verrà spostato. Il secondo è l'identificatore per il percorso in cui l'applicazione deve spostare il contenuto.
HRESULT hr = S_OK;
WCHAR wszSelection[81] = {0};
WCHAR wszDestinationFolderObjectID[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToMove;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToMove;
printf("Enter the identifer of the object you wish to move.\n>");
hr = StringCbGetsW(wszSelection,sizeof(wszSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting content moving\n");
}
// Prompt user to enter an object identifier on the device to move.
printf("Enter the identifer of the object you wish to move '%ws' to.\n>", wszSelection);
hr = StringCbGetsW(wszDestinationFolderObjectID,sizeof(wszDestinationFolderObjectID));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting content moving\n");
}
L'esempio recupera quindi un oggetto IPortableDeviceContent usato per accedere al metodo IPortableDeviceContent::Move .
HRESULT hr = S_OK;
WCHAR wszSelection[81] = {0};
WCHAR wszDestinationFolderObjectID[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToMove;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToMove;
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
Infine, il contenuto viene spostato. Questo processo prevede quanto segue:
- Creazione di un oggetto IPortableDevicePropVariantCollection che riceve una struttura PROPVARIANT per l'oggetto da spostare.
- Aggiunta di PROPVARIANT all'oggetto IPortableDevicePropVariantCollection.
- Richiamare il metodo IPortableDeviceContent::Move.
HRESULT hr = S_OK;
WCHAR wszSelection[81] = {0};
WCHAR wszDestinationFolderObjectID[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDevicePropVariantCollection> pObjectsToMove;
CComPtr<IPortableDevicePropVariantCollection> pObjectsFailedToMove;
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDevicePropVariantCollection,
(VOID**) &pObjectsToMove);
if (SUCCEEDED(hr))
{
if (pObjectsToMove != 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-move list
// (We are only moving 1 in this example)
hr = pObjectsToMove->Add(&pv);
if (SUCCEEDED(hr))
{
// Attempt to move the object on the device
hr = pContent->Move(pObjectsToMove, // Object(s) to move
wszDestinationFolderObjectID, // Folder to move to
NULL); // Object(s) that failed to delete (we are only moving 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 moved on the device.\n", wszSelection);
}
// An S_FALSE return lets the caller know that the move failed.
// The caller should check the returned IPortableDevicePropVariantCollection
// for a list of object identifiers that failed to be moved.
else
{
printf("The object '%ws' failed to be moved on the device.\n", wszSelection);
}
}
else
{
printf("! Failed to move an object on the device, hr = 0x%lx\n",hr);
}
}
else
{
printf("! Failed to move an object on 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 move an object on 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 move 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);
}
}
Argomenti correlati