다음을 통해 공유


IWMDMStorageControl3::Insert3 메서드(mswmdm.h)

Insert3 메서드는 콘텐츠를 스토리지 옆에 배치합니다. 이 메서드는 애플리케이션이 전송되는 개체의 메타데이터 및 형식을 명시적으로 지정할 수 있도록 하여 IWMDMStorageControl2::Insert2 를 확장합니다.

구문

HRESULT Insert3(
  [in]  UINT           fuMode,
  [in]  UINT           fuType,
  [in]  LPWSTR         pwszFileSource,
  [in]  LPWSTR         pwszFileDest,
  [in]  IWMDMOperation *pOperation,
  [in]  IWMDMProgress  *pProgress,
  [in]  IWMDMMetaData  *pMetaData,
  [in]  IUnknown       *pUnknown,
  [out] IWMDMStorage   **ppNewObject
);

매개 변수

[in] fuMode

Insert3 작업에 사용되는 처리 모드입니다. 다음 표에서는 fuMode 매개 변수에 지정할 수 있는 처리 모드를 나열합니다. 처음 두 모드 중 하나, 정확히 STORAGECONTROL 모드 중 하나 및 콘텐츠 모드 중 하나를 정확히 지정해야 합니다. WMDM_MODE_BLOCK 및 WMDM_MODE_THREAD 모두 지정되면 블록 모드가 사용됩니다. 이 함수에서 WMDM_FILE_ATTR* 플래그를 지정하는 것이 먼저 이 함수를 호출한 다음, 생성 또는 전송된 후 파일에 이러한 특성을 설정하는 것보다 더 효율적입니다.

조합 Mode Description
정확히 다음 중 하나입니다. WMDM_MODE_BLOCK 작업은 블록 모드 처리를 사용하여 수행됩니다. 작업이 완료될 때까지 호출이 반환되지 않습니다.
- WMDM_MODE_THREAD 작업은 스레드 모드 처리를 사용하여 수행됩니다. 호출은 즉시 반환되고 작업은 백그라운드 스레드에서 수행됩니다.
선택 사항 WMDM_MODE_QUERY 삽입 작업이 성공할 수 있는지 여부를 확인하기 위한 테스트가 수행되지만 삽입은 수행되지 않습니다.
정확히 다음 중 하나입니다. WMDM_STORAGECONTROL_INSERTBEFORE 개체가 대상 개체 앞에 삽입됩니다.
- WMDM_STORAGECONTROL_INSERTAFTER 개체는 대상 개체 뒤에 삽입됩니다.
- WMDM_STORAGECONTROL_INSERTINTO 개체가 현재 개체에 삽입됩니다. 현재 개체가 폴더인 경우에만 작동합니다.
선택 사항 WMDM_FILE_CREATE_OVERWRITE 개체는 대상 개체를 대체합니다.
정확히 다음 중 하나입니다. WMDM_CONTENT_FILE 삽입되는 콘텐츠는 파일입니다.
- WMDM_CONTENT_FOLDER 삽입되는 콘텐츠가 폴더입니다. 이렇게 하면 폴더의 내용이 전송되지 않습니다.
선택 사항 WMDM_CONTENT_OPERATIONINTERFACE 애플리케이션이 데이터 전송을 제어하기 위해 IWMDMOperation 인터페이스를 전달합니다.
0개 이상: WMDM_FILE_ATTR_READONLY 스토리지는 디바이스에서 읽기 전용으로 설정해야 합니다.
- WMDM_FILE_ATTR_HIDDEN 스토리지는 디바이스에서 숨김으로 설정해야 합니다.
- WMDM_FILE_ATTR_SYSTEM 스토리지는 디바이스의 시스템으로 설정해야 합니다.
선택 사항 WMDM_MODE_PROGRESS 삽입이 진행 중입니다.
선택 사항 중 하나: WMDM_MODE_TRANSFER_PROTECTED 삽입이 보호된 전송 모드에 있습니다.
- WMDM_MODE_TRANSFER_UNPROTECTED 삽입이 보호되지 않는 전송 모드에 있습니다.

[in] fuType

현재 스토리지를 지정하는 다음 형식 중 하나입니다.

Description
WMDM_FILE_ATTR_FILE 현재 스토리지는 파일입니다.
WMDM_FILE_ATTR_FOLDER 현재 스토리지는 폴더입니다.

[in] pwszFileSource

삽입 작업의 콘텐츠를 찾을 위치를 나타내는 null로 끝나는 와이드 문자열에 대한 포인터입니다. fuMode에서 WMDM_CONTENT_OPERATIONINTERFACE 지정한 경우 이 매개 변수는 NULL이어야 합니다. 재생 목록 또는 앨범을 만드는 경우 이 매개 변수는 NULL 일 수 있습니다.

[in] pwszFileDest

디바이스의 파일 이름(선택 사항)입니다. 지정하지 않고 애플리케이션이 IWMDMOperation 포인터를 pOperation에 전달하는 경우 Windows Media 장치 관리자 IWMDMOperation::GetObjectName을 호출하여 대상 이름을 요청합니다. 지정하지 않고 애플리케이션이 pOperation을 사용하지 않는 경우 원래 파일 이름 및 확장명은 경로 없이 사용됩니다.

[in] pOperation

미디어 디바이스로의 콘텐츠 전송을 제어하기 위한 IWMDMOperation 인터페이스에 대한 선택적 포인터입니다. 지정한 경우 fuMode 에는 WMDM_CONTENT_OPERATIONINTERFACE 플래그가 포함되어야 합니다. fuMode에서 WMDM_CONTENT_FILE 또는 WMDM_CONTENT_FOLDER 지정한 경우 이 매개 변수는 NULL이어야 합니다.

[in] pProgress

작업 진행률을 애플리케이션에 다시 보고하기 위한 IWMDMProgress 인터페이스에 대한 선택적 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.

[in] pMetaData

메타데이터 개체에 대한 선택적 포인터입니다. IWMDMStorage3::CreateEmptyMetadataObject를 호출하여 새 메타데이터 개체를 만듭니다. 이 매개 변수를 사용하면 애플리케이션이 디바이스에서 개체를 만드는 동안 디바이스에서 설정할 메타데이터(형식 포함)를 지정할 수 있으며, 이는 나중에 메타데이터를 설정하는 것보다 더 효율적입니다. 파일 형식(g_wszWMDMFormatCode 지정)을 설정해야 합니다. 이 메서드를 사용할 때 파일의 형식 코드를 지정하지 않으면 MTP 디바이스는 해당 사용자 인터페이스에 있는 것처럼 파일을 표시하지 않으며 MTP가 아닌 디바이스는 예측할 수 없이 동작합니다.

[in] pUnknown

보안 콘텐츠 공급자에 전달할 사용자 지정 COM 개체의 선택적 IUnknown 포인터입니다. 이렇게 하면 애플리케이션에 보안 콘텐츠 공급자에 대한 충분한 정보가 있는 경우 보안 콘텐츠 공급자에 사용자 지정 정보를 전달할 수 있습니다.

[out] ppNewObject

새 콘텐츠를 포함할 IWMDMStorage 인터페이스에 대한 포인터입니다. 호출자는 이 인터페이스가 완료되면 이 인터페이스를 해제해야 합니다.

반환 값

이 메서드는 HRESULT를 반환합니다. Windows Media 장치 관리자 모든 인터페이스 메서드는 다음 오류 코드 클래스 중 어느 것을 반환할 수 있습니다.

  • 표준 COM 오류 코드
  • HRESULT 값으로 변환된 Windows 오류 코드
  • Windows Media 장치 관리자 오류 코드
가능한 오류 코드의 광범위한 목록은 오류 코드를 참조하세요.

설명

디바이스로 보낸 후 스토리지에서 메타데이터를 설정할 수 있지만 이 메서드의 pMetaData 매개 변수에서 이 정보를 설정하는 것이 더 효율적입니다. 이렇게 하면 디바이스에 파일을 적절히 전송하고 처리할 수 있도록 추가 정보를 제공하거나(예: 올바른 위치에 저장) 유용한 정보(예: 사진에 대한 사용자 작성 설명)를 표시합니다.

WPD(Windows 이식 장치) 디바이스에 대한 속성을 설정하기 위해 애플리케이션은 IPortableDeviceValues 개체를 만들고 각 속성을 이 컬렉션으로 설정합니다. 그런 다음, 애플리케이션은 컬렉션을 BLOB(Binary Large Object)로 직렬화합니다. 데이터가 직렬화되면 애플리케이션은 g_wszWPDPassthroughPropertyValues 메타데이터 상수를 사용하여 pMetadata 인수에서 참조하는 IWMDMMetaData에 추가합니다.

WMDM_MODE_THREAD 플래그가 지정된 경우 IWMDMProgress2::End2 또는 IWMDMProgress3::End3을 호출하여 완료 상태 가져와야 합니다. 이러한 메서드는 작업이 완료되었는지 확인하고 성공 또는 실패 정보가 포함된 HRESULT도 반환합니다.

애플리케이션이 WMDM_MODE_THREAD 사용하고 null이 아닌 pProgress 매개 변수를 전달하는 경우 Windows Media 장치 관리자 이 개체에 진행률 알림을 보내기 때문에 pProgress가 속한 개체가 읽기 작업이 완료될 때까지 제거되지 않도록 해야 합니다. 이 개체는 최종 알림을 받은 후에만 제거할 수 있습니다. 이렇게 하지 않으면 액세스 위반이 발생합니다.

재생 목록 또는 기타 참조 개체를 만들 때 "삽입"되는 개체는 실제로 데이터를 포함하지 않지만 단순히 다른 개체(예: 음악 파일)에 대한 메타데이터 참조 그룹으로 디바이스에 저장됩니다. 재생 목록에서 이러한 "추상" 개체를 만드는 방법은 디바이스에서 재생 목록 만들기에 설명되어 있습니다.

예제

다음 C++ 함수는 디바이스에 파일을 보냅니다. 전송의 일부로 새 스토리지 유형을 지정하려면 스토리지에 메타데이터를 추가해야 합니다.


HRESULT mySendFile(LPCWSTR pwszFileName, IWMDMStorage* pStorage, IWMDMOperation* pOperation)
{
   HRESULT hr = S_OK;

   // A dummy loop to handle unrecoverable errors. When we hit an error we
   // can't handle or don't like, we just use a 'break' statement.
   // The custom BREAK_HR macro checks for failed HRESULT values and does this.
   do
   {
      if (pwszFileName == NULL || pStorage == NULL)
      {
         BREAK_HR(E_POINTER,"","Bad pointer passed in.");
         return E_POINTER;
      }

      // Make sure the destination is a folder.
      DWORD attributes = 0;
      _WAVEFORMATEX format;
      hr = pStorage->GetAttributes(&attributes, &format);
      if (!(attributes | WMDM_FILE_ATTR_FOLDER))
      {
         BREAK_HR(E_FAIL, "", "Storage submitted to mySendFile is not a folder.");
         return E_FAIL;
      }

      // Transcode the file
      hr = myTranscodeMethod(pwszFileName);
      BREAK_HR(hr, "Couldn't transcode the file in mySendFile.", "Transcoded the file in mySendFile.");
      //
      // Let's set some metadata in the storage.
      //
      CComPtr<IWMDMStorage3> pStorage3;
      hr = pStorage->QueryInterface(__uuidof(IWMDMStorage3), (void**)(&pStorage3));
      BREAK_HR(hr, "Got an IWMDMStorage3 interface in mySendFile.","Couldn't get an IWMDMStorage3 in mySendFile.");

      // First create the IWMDMMetaData interface.
      IWMDMMetaData* pMetadata;
      hr = pStorage3->CreateEmptyMetadataObject(&pMetadata);
      BREAK_HR(hr,"Created an IWMDMMetaData interface in mySendFile.","Couldn't create an IWMDMMetaData interface in mySendFile.");

      //
      // Set the file format.
      //
      WMDM_FORMATCODE fileFormat = myGetWMDM_FORMATCODE(pwszFileName);
      hr = pMetadata->AddItem(WMDM_TYPE_DWORD, g_wszWMDMFormatCode, (BYTE*)&fileFormat, sizeof(WMDM_TYPE_DWORD));


      //
      // Get the proper interface and transfer the file.
      //
      CComPtr<IWMDMStorageControl3> pStgCtl3;
      CComPtr<IWMDMStorage> pNewStorage;
      hr = pStorage->QueryInterface(__uuidof(IWMDMStorageControl3),(void**)(&pStgCtl3));

      // Get the simple file name to use for the destination file.
      wstring destFile = pwszFileName;
      destFile = destFile.substr(destFile.find_last_of(L"\\") + 1);

      // Get a progress indicator.
      CComQIPtr<IWMDMProgress> pProgress(this);

      // Set the flags for the operation.
      UINT flags = WMDM_MODE_BLOCK | // Synchronous call. 
         WMDM_STORAGECONTROL_INSERTINTO | // Insert it into the destination folder.
         WMDM_CONTENT_FILE | // We're inserting a file.
         WMDM_FILE_CREATE_OVERWRITE; // Overwrite existing files.
      if (pOperation != NULL)
         flags |= WMDM_CONTENT_OPERATIONINTERFACE;

      // Send the file and metadata.
      hr = pStgCtl3->Insert3(
         flags,
         WMDM_FILE_ATTR_FOLDER, // The current storage is a folder.
         const_cast<WCHAR*>(pwszFileName), // Source file.
         NULL, // Destination file name.
         pOperation, // Null to allow Windows Media Device Manager to read 
                     // the file; non-null to present raw data bytes to 
                     // Windows Media Device Manager.
         pProgress, // Interface to send simple progress notifications.
         pMetadata, // IWMDMMetaData interface previously created and filled.
         NULL, 
         &pNewStorage);
      if (FAILED(hr))
         m_pLogger->LogDword(WMDM_LOG_SEV_ERROR, NULL, "Error calling Insert3 in mySendFile: %lX", hr);
      BREAK_HR(hr, "Wrote a file to the device in mySendFile", "Couldn't write to the device in mySendFile.");

   } while (FALSE); // End of dummy loop

   return hr;
}

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 mswmdm.h
라이브러리 Mssachlp.lib

추가 정보

디바이스에서 재생 목록 만들기

IWMDMDevice::GetStatus

IWMDMMetaData 인터페이스

IWMDMOperation 인터페이스

IWMDMProgress 인터페이스

IWMDMStorage 인터페이스

IWMDMStorageControl2::Insert2

IWMDMStorageControl3 인터페이스

디바이스에 파일 쓰기