OLE(데이터 개체 및 데이터 원본) 문서에 설명된 대로 데이터 개체와 데이터 원본은 데이터 전송의 양면을 나타냅니다. 이 문서에서는 다음을 포함하여 데이터 전송을 제대로 수행하기 위해 이러한 개체 및 원본을 만들고 삭제하는 시기를 설명합니다.
데이터 개체 만들기
데이터 개체는 대상 애플리케이션(클라이언트 또는 서버)에서 사용됩니다. 대상 애플리케이션의 데이터 개체는 원본 애플리케이션과 대상 애플리케이션 간의 연결의 한쪽 끝입니다. 대상 애플리케이션의 데이터 개체는 데이터 원본의 데이터에 액세스하고 상호 작용하는 데 사용됩니다.
데이터 개체가 필요한 두 가지 일반적인 상황이 있습니다. 첫 번째 상황은 끌어서 놓기를 사용하여 애플리케이션에서 데이터를 삭제하는 경우입니다. 두 번째 상황은 편집 메뉴에서 붙여넣기 또는 붙여넣기 스페셜을 선택하는 경우입니다.
끌어서 놓기 상황에서는 데이터 개체를 만들 필요가 없습니다. 기존 데이터 개체에 대한 포인터가 함수에 OnDrop
전달됩니다. 이 데이터 객체는 끌어서 놓기 작업의 일환으로 프레임워크에 의해 생성되며, 프레임워크에 의해 파괴될 것입니다. 다른 메서드에서 붙여넣기를 수행할 때 항상 그렇지는 않습니다. 자세한 내용은 데이터 개체 삭제를 참조하세요.
애플리케이션이 붙여넣기 또는 붙여넣기 특수 작업을 수행하는 경우 COleDataObject
개체를 만들고 AttachClipboard
멤버 함수를 호출해야 합니다. 이렇게 하면 데이터 개체를 클립보드의 데이터와 연결합니다. 그런 다음 붙여넣기 함수에서 이 데이터 개체를 사용할 수 있습니다.
데이터 개체 삭제
데이터 개체 만들기에 설명된 체계를 따르는 경우 데이터 개체를 삭제하는 것은 데이터 전송의 사소한 측면입니다. 붙여넣기 함수에서 만든 데이터 개체는 붙여넣기 함수가 반환될 때 MFC에 의해 제거됩니다.
붙여넣기 작업을 처리하는 다른 방법을 따르는 경우 붙여넣기 작업이 완료된 후 데이터 개체가 제거되었는지 확인합니다. 데이터 개체가 제거될 때까지 애플리케이션에서 데이터를 클립보드에 복사하는 것은 불가능합니다.
데이터 원본 만들기
데이터 원본은 데이터 전송의 원본에서 사용되며, 클라이언트 또는 데이터 전송의 서버 쪽일 수 있습니다. 원본 애플리케이션의 데이터 원본은 원본 애플리케이션과 대상 애플리케이션 간의 연결의 한쪽 끝입니다. 대상 애플리케이션의 데이터 개체는 데이터 원본의 데이터와 상호 작용하는 데 사용됩니다.
데이터 원본은 애플리케이션이 데이터를 클립보드에 복사해야 할 때 생성됩니다. 일반적인 시나리오는 다음과 같이 실행됩니다.
사용자가 일부 데이터를 선택합니다.
사용자가 편집 메뉴에서 복사(또는 잘라내기)를 선택하거나 끌어서 놓기 작업을 시작합니다.
프로그램의 디자인에 따라 애플리케이션은
COleDataSource
객체 또는COleDataSource
에서 파생된 클래스의 객체를 만듭니다.선택한 데이터는
COleDataSource::CacheData
그룹이나COleDataSource::DelayRenderData
그룹의 함수 중 하나를 호출하여 데이터 원본에 삽입됩니다.애플리케이션은 3단계에서 생성된 개체에 속하는
SetClipboard
멤버 함수를 호출합니다. 이 작업이 끌어서 놓기 작업인 경우DoDragDrop
멤버 함수를 호출합니다.잘라내기 작업이거나
DoDragDrop
DROPEFFECT_MOVE 반환하는 경우 1단계에서 선택한 데이터가 문서에서 삭제됩니다.
이 시나리오는 MFC OLE 샘플 OCLIENT 및 HIERSVR에 의해 구현됩니다.
CView
및 GetClipboardData
함수를 제외한 모든 애플리케이션의 OnGetClipboardData
파생 클래스에 대한 원본을 살펴보세요. 이러한 두 함수는 COleClientItem
또는 COleServerItem
파생 클래스 구현에 있습니다. 이러한 샘플 프로그램은 이러한 개념을 구현하는 방법에 대한 좋은 예제를 제공합니다.
끌어서 놓기 작업의 기본 동작을 수정할 때 COleDataSource
개체를 생성하는 다른 경우가 있을 수 있습니다. 자세한 내용은 OLE 끌어서 놓기: 끌어서 놓기 사용자 지정 기사를 참조하세요.
데이터 원본 삭제
데이터 원본은 현재 데이터 원본을 담당하는 애플리케이션에 의해 제거되어야 합니다.
COleDataSource::DoDragDrop 호출과 같이 데이터 원본을 OLE에 전달하는 경우 pDataSrc->InternalRelease
를 호출해야 합니다. 다음은 그 예입니다.
void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
UNREFERENCED_PARAMETER(pResult);
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
CMyDataSource* pDataSrc = new CMyDataSource();
if (NULL != pDataSrc)
{
pDataSrc->Initialize(pNMLV, this);
pDataSrc->DelayRenderData((CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
pDataSrc->DoDragDrop();
pDataSrc->InternalRelease();
}
}
OLE에 데이터 원본을 전달하지 않은 경우 일반적인 C++ 개체와 마찬가지로 데이터 원본을 삭제할 책임이 있습니다.
자세한 내용은 끌어서 놓기, 클립보드 및 데이터 개체 및 데이터 원본 조작을 참조하세요.