캐싱 보기
컨테이너 애플리케이션은 문서가 열려 있지만 개체의 서버 애플리케이션이 실행되고 있지 않거나 사용자의 컴퓨터에 설치되지 않은 경우 사용자를 위해 개체를 표시하거나 인쇄하기 위해 개체의 프레젠테이션을 가져올 수 있어야 합니다. 그러나 문서에서 찾을 수 있는 모든 개체에 대한 서버가 모든 사용자의 컴퓨터에 설치되어 있으며 항상 요청 시 실행할 수 있다고 가정하는 것은 비현실적입니다. 항상 사용할 수 있는 기본 개체 처리기는 컨테이너의 특정 설치에서 개체 서버의 가용성에 관계없이 문서의 스토리지에 개체 프레젠테이션을 캐싱하고 모든 플랫폼에서 이러한 프레젠테이션을 조작하여 이 딜레마를 해결합니다.
컨테이너는 화면에서 개체를 유지하는 데 필요한 것 외에도 하나 이상의 특정 대상 디바이스에 대한 그리기 프레젠테이션을 유지할 수 있습니다. 또한 한 플랫폼에서 다른 플랫폼으로 개체를 이식하는 경우 OLE는 개체의 데이터 형식을 새 플랫폼에서 지원되는 형식으로 자동으로 변환합니다. 예를 들어 Windows에서 Macintosh로 개체를 이동하는 경우 OLE는 메타파일 프레젠테이션을 PICT 형식으로 변환합니다.
포함된 개체의 정확한 표현을 사용자에게 표시하기 위해 개체의 컨테이너 애플리케이션은 개체 처리기를 사용하여 데이터를 요청하고 지침을 그리는 대화 상자를 시작합니다. 컨테이너의 요청을 처리하려면 처리기가 IDataObject, IViewObject2 및 IOleCache 인터페이스를 구현해야 합니다.
IDataObject 를 사용하면 OLE 컨테이너 애플리케이션에서 데이터를 가져와 포함된 개체 또는 연결된 개체로 데이터를 보낼 수 있습니다. 개체의 데이터가 변경되면 이 인터페이스는 개체가 해당 컨테이너에 새 데이터를 사용할 수 있도록 하는 방법을 제공하고 개체의 복사본에서 데이터를 업데이트하는 방법을 컨테이너에 제공합니다. (일반적으로 데이터 전송에 대한 논의는 챕터 4, 데이터 전송을 참조하세요.)
IViewObject2 인터페이스는 데이터를 메모리 또는 다른 전송 매체로 이동하거나 복사하는 대신 개체가 화면, 프린터 또는 메타파일과 같은 디바이스 컨텍스트에 그리도록 요청하는 것을 제외하고는 IDataObject 인터페이스와 매우 유사합니다. 인터페이스의 목적은 OLE 컨테이너가 이미 데이터가 있는 포함된 개체의 대체 그림 표현을 가져올 수 있도록 하여 단순히 새 그리기 지침을 얻기 위해 동일한 데이터 개체의 완전히 새로운 인스턴스를 전송해야 하는 오버헤드를 방지하는 것입니다. 대신 IViewObject2인터페이스를 사용하면 컨테이너에서 지정한 디바이스 컨텍스트를 그려 개체에 그림 표현을 제공하도록 요청할 수 있습니다.
IViewObject2 인터페이스를 호출할 때 컨테이너 애플리케이션은 개체가 실제로 렌더링될 대상 디바이스와 다른 대상 디바이스에서 자체 그리기를 지정할 수도 있습니다. 이렇게 하면 필요에 따라 컨테이너가 단일 개체에서 다른 렌더링을 생성할 수 있습니다. 예를 들어 호출자는 결과 드로잉이 화면에 렌더링되더라도 개체에 프린터를 직접 작성하도록 요청할 수 있습니다. 물론 결과는 개체의 인쇄 미리 보기가 됩니다.
IViewObject2인터페이스는 컨테이너가 보기 변경 알림에 등록할 수 있도록 하는 메서드도 제공합니다. 데이터 및 OLE 권고와 마찬가지로 보기 권고 연결을 사용하면 컨테이너가 개체의 호출에 대한 응답이 아니라 고유한 편의상 개체의 렌더링을 업데이트할 수 있습니다. 예를 들어 새 버전의 개체 서버 애플리케이션이 동일한 데이터의 추가 보기를 제공하는 경우 개체의 기본 처리기는 각 컨테이너의 IAdviseSink::OnViewChange 구현을 호출하여 새 프레젠테이션을 사용할 수 있음을 알릴 수 있습니다. 컨테이너는 필요한 경우에만 조언 싱크에서 이 정보를 검색합니다.
Windows 디바이스 컨텍스트는 단일 프로세스 내에서만 의미가 있으므로 프로세스 경계를 넘어 IViewObject2 포인터를 전달할 수 없습니다. 따라서 OLE 로컬 및 원격 서버는 인터페이스를 구현할 필요가 없으므로 인터페이스가 제대로 작동하지 않습니다. 개체 처리기 및 In-Process 서버만 IViewObject2인터페이스를 구현합니다. OLE는 OLE 기본 처리기를 집계하기만 하면 고유한 OLE In-Process 서버 및 개체 처리기에서 사용할 수 있는 기본 구현을 제공합니다. 또는 IViewObject2의 고유한 구현을 작성할 수 있습니다.
개체는 처리기에 캐시해야 하는 기능을 알리기 위해 IOleCache 인터페이스를 구현합니다. 또한 개체 처리기는 캐시를 소유하고 최신 상태로 유지되도록 합니다. 포함된 개체가 실행 중 상태가 되면서 처리기는 자체 싱크 역할을 하면서 서버 개체에 적절한 권고 연결을 설정합니다. IDataObject 및 IViewObject2인터페이스 구현은 클라이언트 쪽에서 캐시된 데이터에서 작동합니다. 처리기의 IViewObject2구현은 클라이언트 그리기 요청을 충족하기 위해 캐시할 데이터 형식을 결정합니다. 처리기의 IDataObject 구현은 메모리와 포함된 개체의 기본 IStorage instance 간에 다양한 형식으로 데이터를 가져오는 역할을 합니다. 사용자 지정 처리기는 기본 처리기를 집계하여 이러한 구현을 사용할 수 있습니다.
참고
IViewObject2 인터페이스는 IViewObject의 간단한 기능 확장이며 이제 사용되지 않는 후자의 인터페이스 대신 구현되어야 합니다. IViewObject 메서드를 제공하는 것 외에도 IViewObject2 인터페이스는 컨테이너 애플리케이션이 IOleObject::GetExtent를 호출하여 개체를 실행 중 상태로 이동하지 않고도 캐시에서 개체의 프레젠테이션 크기를 가져올 수 있도록 하는 단일 추가 멤버 GetExtent를 제공합니다.