많은 애플리케이션을 통해 사용자는 마우스로 데이터를 끌어서 놓거나 클립보드를 사용하여 다른 애플리케이션으로 데이터를 전송할 수 있습니다. 전송할 수 있는 많은 유형의 데이터 중에는 파일 또는 폴더와 같은 Shell 개체가 있습니다. 셸 데이터 전송은 두 애플리케이션 간에 이루어질 수 있지만 사용자는 셸 데이터를 데스크톱 또는 Windows 탐색기 간에 전송할 수도 있습니다.
파일이 가장 일반적으로 전송되는 Shell 개체이지만 셸 데이터 전송에는 Shell 네임스페이스있는 다양한 개체가 포함될 수 있습니다. 예를 들어 애플리케이션은 파일을 휴지통과 같은 가상 폴더로 전송하거나 Microsoft가 아닌 네임스페이스 확장명에서 개체를 수락해야 할 수 있습니다. 네임스페이스 확장을 구현하는 경우 드롭 소스 및 대상으로 올바르게 동작할 수 있어야 합니다.
이 문서에서는 애플리케이션이 Shell 개체를 사용하여 끌어서 놓기 및 클립보드 데이터 전송을 구현하는 방법을 설명합니다.
- 셸 데이터 개체
- 셸 클립보드 형식
- 셸 데이터 전송 시나리오 처리
셸 개체에 대한 끌어서 놓기의 작동 원리
애플리케이션은 셸 데이터를 전송하는 방법을 사용자에게 제공해야 하는 경우가 많습니다. 몇 가지 예는 다음과 같습니다.
- Windows 탐색기 또는 데스크톱에서 파일을 끌어 애플리케이션에 놓습니다.
- Windows 탐색기에서 클립보드에 파일을 복사하여 애플리케이션에 붙여넣습니다.
- 애플리케이션에서 휴지통으로 파일을 끌어다 냅니다.
이러한 시나리오 및 기타 시나리오를 처리하는 방법에 대한 자세한 내용은 셸 데이터 전송 시나리오 처리를 참조하세요. 이 문서에서는 Shell 데이터 전송의 일반적인 원칙에 중점을 둡니다.
Windows는 애플리케이션이 셸 데이터를 전송하는 두 가지 표준 방법을 제공합니다.
- 사용자가 하나 이상의 파일과 같은 셸 데이터를 클립보드에 잘라내거나 복사합니다. 다른 애플리케이션은 클립보드에서 데이터를 검색합니다.
- 사용자가 원본 애플리케이션에서 데이터를 나타내는 아이콘을 끌어 대상 소유 창에 아이콘을 놓습니다.
두 경우 모두 전송된 데이터는 데이터 개체포함됩니다. 데이터 개체는 IDataObject 인터페이스를 노출하는 COM(Component Object Model) 개체입니다. 개략적으로 모든 셸 데이터 전송이 따라야 하는 세 가지 필수 단계가 있습니다.
- 원본은 전송할 데이터를 나타내는 데이터 개체를 만듭니다.
- 대상은 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 받습니다.
- 대상은 IDataObject 인터페이스를 호출하여 데이터를 추출합니다.
클립보드와 끌어서 놓기 데이터 전송의 차이점은 주로 IDataObject 포인터가 원본에서 대상으로 전송되는 방식에 있습니다.
클립보드 데이터 전송
클립보드는 셸 데이터를 전송하는 가장 간단한 방법입니다. 기본 절차는 표준 클립보드 데이터 전송과 유사합니다. 그러나 데이터 자체가 아닌 데이터 개체에 대한 포인터를 전송하기 때문에 표준 클립보드 API 대신 OLE 클립보드 API를 사용해야 합니다. 다음 절차에서는 OLE 클립보드 API를 사용하여 클립보드를 사용하여 셸 데이터를 전송하는 방법을 간략하게 설명합니다.
- 데이터 원본은 데이터를 포함할 데이터 개체를 만듭니다.
- 데이터 원본은 OleSetClipboard호출합니다. 이 호출은 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 클립보드에 배치합니다.
- 대상은 OleGetClipboard 호출하여 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 검색합니다.
- 대상은 IDataObject::GetData 메서드를 호출하여 데이터를 추출합니다.
- 일부 Shell 데이터 전송에서 대상은 데이터 개체의 IDataObject::SetData 메서드를 호출하여 데이터 전송 결과에 대한 피드백을 데이터 개체에 제공해야 할 수도 있습니다. 이 유형의 작업에 대한 예는 이동 작업 최적화 처리을 참조하세요.
끌어서 놓기로 데이터 전송
구현하기는 다소 복잡하지만 끌어서 놓기 데이터 전송은 클립보드에 비해 몇 가지 중요한 이점이 있습니다.
- 끌어서 놓기 전송은 간단한 마우스 이동으로 수행할 수 있으므로 클립보드보다 작업을 더 유연하고 직관적으로 사용할 수 있습니다.
- 끌어서 놓기 기능은 사용자에게 작업의 시각적 표현을 제공합니다. 사용자가 원본에서 대상으로 이동할 때 아이콘을 따를 수 있습니다.
- 드래그 앤 드롭은 데이터가 준비되면 대상에 알립니다.
끌어서 놓기 작업도 데이터 개체를 사용하여 데이터를 전송합니다. 그러나 드롭 소스는 클립보드 전송에 필요한 것 이상의 기능을 제공해야 합니다.
- 또한 드롭 소스는 IDropSource 인터페이스를 노출하는 개체를 만들어야 합니다. 시스템은 작업이 진행되는 동안 IDropSource 사용하여 원본과 통신합니다.
- 끌어서 놓기 데이터 개체는 커서 이동을 추적하고 데이터 개체를 나타내는 아이콘을 표시합니다.
드롭 대상은 클립보드 전송을 처리하는 데 필요한 것보다 더 많은 기능을 제공해야 합니다.
- 놓기 대상은 IDropTarget 인터페이스를 노출해야 합니다. 커서가 대상 창 위에 있는 경우 시스템은 IDropTarget 사용하여 대상에 커서 위치와 같은 정보를 제공하고 데이터가 삭제될 때 이를 알립니다.
- 놓기 대상은 시스템에 등록하기 위해 반드시 RegisterDragDrop을(를) 호출해야 합니다. 이 함수는 대상 창에 대한 핸들과 대상 애플리케이션의 IDropTarget 인터페이스에 대한 포인터를 시스템에 제공합니다.
메모
끌어서 놓기 작업의 경우 애플리케이션은 OleInitialize를 사용하여 COM을 초기화해야 하며, CoInitialize를 사용하지 않아야 합니다.
다음 절차에서는 일반적으로 끌어서 놓기를 사용하여 셸 데이터를 전송하는 데 사용되는 필수 단계를 간략하게 설명합니다.
- 대상은 RegisterDragDrop을 호출하여 시스템에 IDropTarget 인터페이스에 대한 포인터를 제공하고 해당 창을 드롭 대상으로 등록합니다.
- 사용자가 끌어서 놓기 작업을 시작하면 원본은 데이터 개체를 만들고 DoDragDrop호출하여 끌기 루프 시작합니다.
- 커서가 대상 창 위에 있으면 시스템에서 대상의 IDropTarget 메서드 중 하나를 호출하여 대상에 알립니다. 커서가 대상 창에 들어가면 시스템은 IDropTarget::DragEnter을 호출하고, 커서가 대상 창 위를 지나갈 때 시스템은 IDropTarget::DragOver을 호출합니다. 두 방법 모두 현재 커서 위치와 Ctrl 또는 Alt와 같은 키보드 수정 키의 상태를 drop 대상에게 제공합니다. 커서가 대상 창을 벗어나면 시스템에서 IDropTarget::D ragLeave호출하여 대상에 알립니다. 이러한 메서드 중 하나라도 반환되면 시스템은 IDropSource 인터페이스를 호출하여 반환 값을 원본에 전달합니다.
- 사용자가 마우스 단추를 놓아 데이터를 삭제하면 시스템에서 대상의 IDropTarget::D rop 메서드를 호출합니다. 메서드의 매개 변수 중에는 데이터 개체의 IDataObject 인터페이스에 대한 포인터가 있습니다.
- 대상은 데이터 개체의 IDataObject::GetData 메서드를 호출하여 데이터를 추출합니다.
- 일부 셸 데이터 전송에서 대상은 데이터 전송 결과에 대한 피드백을 원본에 제공하기 위해 데이터 개체의 IDataObject::SetData 메서드를 호출해야 할 수도 있습니다.
- 대상이 데이터 개체를 완료한 후에 IDropTarget::Drop에서 반환됩니다. 시스템은 원본의 DoDragDrop 호출을 반환하여 원본에 데이터 전송이 완료되었음을 알립니다.
- 특정 데이터 전송 시나리오따라 원본은 DoDragDrop 반환된 값 및 대상에 의해 데이터 개체에 전달되는 값을 기반으로 추가 작업을 수행해야 할 수 있습니다. 예를 들어 파일이 이동되면 원본에서 이러한 값을 확인하여 원본 파일을 삭제해야 하는지 여부를 확인해야 합니다.
- 소스는 데이터 대상을 해제합니다.
위에서 설명한 프로시저는 셸 데이터 전송에 적합한 일반 모델을 제공하지만 Shell 데이터 개체에 포함할 수 있는 다양한 유형의 데이터가 있습니다. 애플리케이션에서 처리해야 할 수 있는 다양한 데이터 전송 시나리오도 있습니다. 각 데이터 형식 및 시나리오에는 프로시저의 세 가지 주요 단계에 대해 다소 다른 접근 방식이 필요합니다.
- 원본이 셸 데이터를 포함하도록 데이터 개체를 생성하는 방법입니다.
- 대상이 데이터 개체에서 셸 데이터를 추출하는 방법입니다.
- 원본이 데이터 전송 작업을 완료하는 방법입니다.
Shell 데이터 개체 원본이 Shell 데이터 개체를 생성하는 방법과 대상에서 해당 데이터 개체를 처리하는 방법에 대한 일반적인 설명을 제공합니다. 셸 데이터 전송 시나리오 처리 일반적인 셸 데이터 전송 시나리오를 처리하는 방법에 대해 자세히 설명합니다.