디바이스에서 PC로 콘텐츠 전송
WPD 애플리케이션에서 수행하는 일반적인 작업 중 하나는 연결된 디바이스에서 PC로 콘텐츠를 전송하는 것입니다.
콘텐츠 전송은 다음 표에 설명된 인터페이스를 사용하여 수행됩니다.
인터페이스 | Description |
---|---|
IPortableDeviceContent 인터페이스 | IPortableDeviceProperties 인터페이스에 대한 액세스를 제공합니다. |
IPortableDeviceProperties 인터페이스 | 속성별 메서드에 대한 액세스를 제공합니다. |
IPortableDeviceResources 인터페이스 | 지정된 프로필의 속성 키를 저장하는 데 사용됩니다. |
IStream 인터페이스 | 데이터를 읽고 쓰는 데 사용됩니다. |
샘플 애플리케이션의 ContentTransfer.cpp 모듈의 함수는 TransferContentFromDevice
애플리케이션이 연결된 디바이스에서 PC로 연락처 정보를 전송하는 방법을 보여 줍니다.
함수에서 TransferContentFromDevice
수행하는 첫 번째 작업은 사용자에게 디바이스에서 부모 개체에 대한 개체 식별자를 입력하라는 메시지를 표시하는 것입니다(콘텐츠가 전송되는 경우).
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDeviceResources> pResources;
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IStream> pObjectDataStream;
CComPtr<IStream> pFinalFileStream;
DWORD cbOptimalTransferSize = 0;
CAtlStringW strOriginalFileName;
if (pDevice == NULL)
{
printf("! A NULL IPortableDevice interface pointer was received\n");
return;
}
// Prompt user to enter an object identifier on the device to transfer.
printf("Enter the identifer of the object you wish to transfer.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting content transfer\n");
}
다음 단계는 샘플이 콘텐츠 관련 메서드에 액세스하는 데 사용하는 IPortableDeviceContent 개체를 검색하는 것입니다.
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
다음 단계는 샘플이 리소스별 메서드에 액세스하는 데 사용하는 IPortableDeviceResources 개체를 검색하는 것입니다.
if (SUCCEEDED(hr))
{
hr = pContent->Transfer(&pResources);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceResources from IPortableDeviceContent, hr = 0x%lx\n",hr);
}
}
다음 단계는 샘플이 디바이스에서 전송하는 데이터를 읽는 데 사용하는 IStream 개체를 검색하는 것입니다.
if (SUCCEEDED(hr))
{
hr = pResources->GetStream(szSelection, // Identifier of the object we want to transfer
WPD_RESOURCE_DEFAULT, // We are transferring the default resource (which is the entire object's data)
STGM_READ, // Opening a stream in READ mode, because we are reading data from the device.
&cbOptimalTransferSize, // Driver supplied optimal transfer size
&pObjectDataStream);
if (FAILED(hr))
{
printf("! Failed to get IStream (representing object data on the device) from IPortableDeviceResources, hr = 0x%lx\n",hr);
}
}
다음 단계는 디바이스에서 개체의 파일 이름을 검색하는 것입니다. 이 문자열은 PC에서 해당 파일 이름을 만드는 데 사용됩니다. 개체에 디바이스에 파일 이름이 없으면 개체의 식별자가 문자열로 변환되고 대상 파일 이름을 만드는 데 사용됩니다.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (SUCCEEDED(hr))
{
hr = GetStringValue(pProperties,
szSelection,
WPD_OBJECT_ORIGINAL_FILE_NAME,
strOriginalFileName);
if (FAILED(hr))
{
printf("! Failed to read WPD_OBJECT_ORIGINAL_FILE_NAME on object '%ws', hr = 0x%lx\n", szSelection, hr);
strOriginalFileName.Format(L"%ws.data", szSelection);
printf("* Creating a filename '%ws' as a default.\n", (PWSTR)strOriginalFileName.GetString());
// Set the HRESULT to S_OK, so we can continue with our newly generated
// temporary file name.
hr = S_OK;
}
}
else
{
printf("! Failed to get IPortableDeviceProperties from IPortableDeviceContent, hr = 0x%lx\n", hr);
}
}
이 후에 샘플은 대상 IStream 개체를 만듭니다.
if (SUCCEEDED(hr))
{
hr = SHCreateStreamOnFile(strOriginalFileName, STGM_CREATE|STGM_WRITE, &pFinalFileStream);
if (FAILED(hr))
{
printf("! Failed to create a temporary file named (%ws) to transfer object (%ws), hr = 0x%lx\n",(PWSTR)strOriginalFileName.GetString(), szSelection, hr);
}
}
마지막으로 원본 IStream 개체가 PC의 대상에 복사됩니다.
if (SUCCEEDED(hr))
{
DWORD cbTotalBytesWritten = 0;
// Since we have IStream-compatible interfaces, call our helper function
// that copies the contents of a source stream into a destination stream.
hr = StreamCopy(pFinalFileStream, // Destination (The Final File to transfer to)
pObjectDataStream, // Source (The Object's data to transfer from)
cbOptimalTransferSize, // The driver specified optimal transfer buffer size
&cbTotalBytesWritten); // The total number of bytes transferred from device to the finished file
if (FAILED(hr))
{
printf("! Failed to transfer object from device, hr = 0x%lx\n",hr);
}
else
{
printf("* Transferred object '%ws' to '%ws'.\n", szSelection, (PWSTR)strOriginalFileName.GetString());
}
}
관련 항목