1. OLE?

서로 다른 응용프로그램들이 프로그램 안에 있는 데이터를 편집할 수 있도록 하는 프록램을 작성할수 있도록 하는 메카니즘이다. (예를 들자면 오피스웨어에서 포토ㅤㅅㅑㅍ에서 수정하던 그림을 특정 포맷으로 변환하지 않고 바로 붙이기 하는 경우와 같은 경우....)

이렇게 다른 프로그램이 자신이 짠 프로그램에서 마치 자신의 프로그램의 데이터인 것 처럼 다루어지지만, 사실은 다른 프로그램이 그 데이터를 다루는 것 일 뿐이다.

외부의 데이터를 다루는 방식은 2가지이다.
외부 객체를 현재 프로그램에 대한 도큐먼트의 부분으로서 저장하지 않고, 다른 프로그램에서의 레퍼런스로만 저장시키는 방식, 두번째로는 다른 프로그램의 도큐먼트를 자신의 프로그램에 엠베딩 시켜서 내부에 아예 포함해버리는 방식. 이렇게 2가지가 있을 수 있다.

2. 컨테이너와 서버

컨테이너 : 임베드된 객체를 처리할 수 있는 프로그램을 OLE 컨테이너라고 부른다.
OLE서버 : 서버는 컨테이너에 들어갈 객체를 생성한다. 풀서버는 독립적인 프로그램으로 작동할 수 있거나, 복합 도큐먼트 안에 임베드된 객체로 작동한다. 미니서버는 standalone 모드로서 작동하지 못한다. 오로지 객체를 만들기만 할 뿐이다.

3. 작동하는 방식

OLE 컨테이너, 서버 사이의 통신은 윈도우 운영체제를 매개로 동작한다. 각 OLE 를 지원하는 프로그램은 공통의 OLE DLL을 가지는데 이 것이 윈도우의 기본지원 부분이다. DLL 안의 함수들은 이렇게 객체사이의 통신을 지원한다. 이때 이를 지원하는 표준적인 인터페이스가 COM(Component Object Model)이다. 본질적으로 엠비드된 객체의 모양과 컨테이너가 그것과 통신하는 방법을 정의한것이다.

4. OLE COM

OLE 서버와 같은 COM객체는 IUnknown 이라는 인터페이스를 구현하고 있따.
QueryInterface() 특정한 인터페이스가 객체에 의해 지원되는지를 검사. 지원된다면 포인터가 리턴된다.
AddRef() 인터페이스를 사용하는 클라이언트의 개수에 대한 카운터를 증가시킨다.
Release() 인터페이스를 사용하는 클라이언트의 개수에 대한 카운터를 감소시킨다. 카운터가 0이되면 더이상 사용되지 않으므로 메모리에서 해제될 수 있다.
이외에도 다른 인터페이스들도 있다. 인터페이스의 이름은 I로 시작하는 것이 원칙이다. 또한 프로그래머가 자신만의 커스텀 인터페이
스를 만들어서 사용하는 것도 가능하다.

5. Registry

OLE서버를 어떤 방식으로 식별할 것인가? OLE객체는 문서, 프로그램등 OLE를 지원하는 어떤 프로그램도 될 수 있다. 시스템에 있는 각각의 OLE객체는 클래스 ID 또는 CLSID라고 부르는 128비트의 숫자로 식별한다. 이들은 GUID라고도 불리우며 알고리즘을 통해서 생성되기 때문에 모두 독특한 값을 지니게된다. 이러한 정보는 윈도우 시스템의 레지스트리에 저장되게 된다.

6. MFC의 OLE 지원 객체들

6.1. OLE 객체 클래스

CDocItem 에서 파생되는 2개의 클래스 COleClientItem, COleServerItem 은 각각 컨테이너와 서버의 관점에 해당하는 OLE객체를 나타낸다.

6.1.1. 컨테이너에 임베드된 객체

COleClientItem 에는 엠베드된 항목의 관리를 위해 컨테이너가 필요로하는 인터페이스들이 존재한다.
OnChange() 임베드된 객체에 변경사항이 존재하면 그 항목의 서버에 보고될 때 프레임웍에 의해 호출된다. 일반적인 경우는 임베드된 객체를 다시 그릴때이다.
OnGetItemPosition() OLE객체가 표시되어야 하는 컨테이너의 클라이언트 영역의 직사각형을 얻기 위해 프레임웍에 의해 호출
OnChangeItemPosition() 엠베드된 객체의 범위가 편집 작업 동안 변경되었다는 것을 컨테이너에 알리기 위해 프레임웍에 의해 호출
Serialize() 컨테이너 안에 추가된 객체를 직렬화 하는데 필요함

6.2. 서버안에 있는 엠베드된 객체

COleServerItem 안에서 서버를 지원하는 인터페이스도 많은 함수를 갖는다.
OnDraw() 객체가 in-place 활성화 되었을때 서버에 있는 뷰클래스의 OnDraw() 함수에 의해서 그려진다. 따라서 컨테이너에 잇는 요소를 그리는 일은 서버측에서 구현되어야 하는 것이다.
Serialize() 컨테이너의 요청을 받고 객체를 직렬화하는 것임.
OnGetExtent() 임베드된 객체의 실제 범위를 얻기 위해 프레임웍에 의해 호출되는 부분이다.
NotifyChanged() 서버에서 객체가 변경되면, 이 객체를 임베드 하고 있는 모든 컨테이너에게 이를 알려 컨테이너가 OnChanged()를 호출하도록 한다.

6.3. OLE 도큐먼트 클래스

컨테이너측에는 COleDocument, COleLinkingDoc 이 존재한다. 전자의 경우는 in-place 활성화를 지원하며, 후자는 링크방식을 지원한다.
서버측에는 COleServerDoc에서 파생된 도큐먼트를 이용한다. 서버측에서는 반드시 OnGetEmbeddedItem() 멤버를 구현해야한다. 이는 이 함수가 순수가상 함수이기 때문이다.

Retrieved from http://wiki.zeropage.org/wiki.php/MFC/ObjectLinkingEmbedding
last modified 2021-02-07 05:23:42