디바이스에서 콘텐츠 이동
WPD 애플리케이션에서 수행하는 또 다른 일반적인 작업은 디바이스의 한 위치에서 다른 위치로 콘텐츠를 전송하는 것입니다.
콘텐츠 이동 작업은 다음 표에 설명된 인터페이스를 사용하여 수행됩니다.
인터페이스 | Description |
---|---|
IPortableDeviceContent 인터페이스 | 콘텐츠별 메서드에 대한 액세스를 제공합니다. |
IPortableDevicePropVariantCollection 인터페이스 | 속성별 메서드에 대한 액세스를 제공합니다. |
샘플 애플리케이션의 ContentTransfer.cpp 모듈에 있는 MoveContentAlreadyOnDevice 함수는 애플리케이션이 콘텐츠를 한 위치에서 다른 위치로 이동하는 방법을 보여 줍니다.
MoveContentAlreadyOnDevice 함수에서 수행하는 첫 번째 작업은 디바이스 드라이버를 쿼리하여 콘텐츠 이동을 지원하는지 확인하는 것입니다. 이는 SupportsCommand 도우미 함수를 호출하고 WPD_COMMAND_OBJECT_MANAGEMENT_MOVE_OBJECTS 두 번째 인수로 전달하여 수행됩니다.
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;
}
다음 단계에서는 사용자에게 두 개의 개체 식별자를 입력하라는 메시지를 표시합니다. 첫 번째는 이동할 콘텐츠의 식별자입니다. 두 번째는 애플리케이션이 이 콘텐츠를 이동해야 하는 위치에 대한 식별자입니다.
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");
}
다음으로, 샘플은 IPortableDeviceContent ::Move 메서드에 액세스하는 데 사용되는 IPortableDeviceContent 개체를 검색합니다.
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);
}
}
마지막으로 콘텐츠가 이동됩니다. 이 프로세스에는 다음이 포함됩니다.
- 이동할 개체에 대한 PROPVARIANT 구조를 수신하는 IPortableDevicePropVariantCollection 개체를 만듭니다.
- IPortableDevicePropVariantCollection 개체에 PROPVARIANT를 추가합니다.
- 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);
}
}
관련 항목