다음을 통해 공유


디바이스에서 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());
    }
}

IPortableDevice 인터페이스

IPortableDeviceContent 인터페이스

IPortableDeviceValues 인터페이스

프로그래밍 가이드