멀티미디어 지식공작소 | 'COM' 태그의 글 목록 (2 Page)
멀티미디어 지식공작소 위치로그  |  태그  |  미디어로그  |  방명록
icon COM 에 해당하는 글2 개
2008.02.03   [펌] COM 인터페이스


icon [펌] COM 인터페이스
프로그램 기술/C/C++/MFC | 2008. 2. 3. 18:13
출처 블로그 > 푸른의 블로그
원본 http://blog.naver.com/alertbattle/80017909887

Ⅰ. COM을 위한 기초 클래스


1. 순수 가상 함수와 추상 기본 클래스

순수 가상 함수 : 기본 클래스에서 가상 함수의 속성이 정의되어 있지 않은 함수로, 0으로 초기화시켜 주어야

추상 기본 클래스 : 클래스 선언문 내에 하나 이상의 순수 가상 함수를 가지고 있는 클래스.

추상 기본 클래스로부터 상속받은 클래스는
반드시 추상 기본 클래스에서 선언된 순수 가상 함수를 모두 오버라이딩해야 한다.



Ⅱ. COM 개요


1. COM의 개요
COM(Component Object Model)은 컴포넌트를 만들기 위한 규정을 체계적으로 정리해 놓은 규정집이다.

컴포넌트를 사전적으로 정의하면, 어떤 제품의 부품이나 구성요소 혹은 이들의 집합체를 의미한다.

모듈화란 독립적인 의미보다는 프로그램의 분리를 통해 개발 기간을 단축시키는데 의의를 두고 있으나,
컴포넌트는 자체적으로 독립적이다.


2. COM 인터페이스
인터페이스란, 공학적으로 서로 다른 시스템 간의 통신을 하며, 기능을 수행할 수 있는 규정이나 방법이다.

COM 인터페이스는 가상 함수 테이블로서 구현된다.


3. COM의 패키지화
COM은 윈도우 환경 하에 아래와 같이 패키지화된다.

① DLL 내에 포함 - In Process Server ; DLL 내에 포함된 객체는, 클라이언트와 같은 주소 공간 내에서 실행

② EXE 내에 포함 - Out Of Process Server ; EXE 로서 패키지화되는 객체는, 그들 자신의 주소 공간을 확보

③ 원격 서비스처럼 다른 장소에서 제공 - Service Program


4. 컴포넌트를 만들기 위한 규정
① 언어 독립적이다.
이진 표준(Binary Standard)을 정의한다.
③ 동적 연결이 가능해야.
④ 위치 투명성을 제공해야.


5. DLL의 등록과 해제

C:\WINDOWS\SYSTEM\regsvr32 xxx.dll

C:\WINDOWS\SYSTEM\regsvr32 /u xxx.dll



Ⅲ. 인터페이스


1. 인터페이스의 개요
인터페이스는 COM에 있어서 클라이언트들이 COM 자신에게 접근할 수 있는 통신 채널을 제공한다.

즉, COM의 구현 부분은 완전히 캡슐화되어 있고, 사용자는 인터페이스를 통해 COM에 접근할 수 있다.

클라이언트는 인터페이스를 통해, 함수 포인터의 배열을 가리키는 포인터를 획득한다.

인터페이스를 둠으로써, 함수의 구현 부분과 인터페이스를 분리시킨다.

인터페이스는 struct이다.

#define interface struct -> Objbase.h 에 정의 -> C:\Program Files\Ms Visual Studio\VC98\Include

인터페이스는 컴포넌트와 클라이언트 사이에서,
특정 함수의 서비스는 항상 동일한 접근방법으로 가능하다는 것을 명시한 계약서와 같다.


2. 가상 함수 테이블
순수 추상 클래스를 정의하는 것은, 실제로 메모리의 블록을 정의하는 것과 동일하다.

메모리 블록은 파생 클래스에서 추상 클래스가 구현되기 전까지는 할당되지 않는다.
추상클래스가 구현되면 메모리 블록은 2개의 부분으로 나누어진다.
하나는 Virtual Function Table(Virtual Method Table, vtbl, vtable)이고,
다른 하나는 vtbl에 대한 포인터이다.

cf) vbptr(virtual base table pointer)



Ⅳ. QueryInterface


1. 인터페이스에 대한 질의 ; QueryInterface()

모든 COM은 IUnknown이라는 인터페이스를 노출하고,
클라이언트가 이 IUnknown이라는 인터페이스를 이용하여 QueryInterface() 함수를 호출할 경우,
해당 인터페이스를 반환하는 방식을 취하고 있다.

IUnknown은 Unknwn.h 에 정의되어 있으며, 아래와 같다.

typedef interface IUnknown IUnknown;

cf) typedef interface IClassFactory IClassFactory;

IUnknown
{
public:
     BEGIN_INTERFACE
     virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) = 0;
      
     virtual ULONG __stdcall AddRef(void) = 0;
       
     virtual ULONG __stdcall Release(void) = 0;
}

Unknwn.h 에 정의 -> C:\Program Files\Ms Visual Studio\VC98\Include

모든 COM 인터페이스는 IUnknown 내의  세 함수들로 시작한다.
즉, 모든 인터페이스는 IUnknown으로부터 파생되어야 한다.


2. IUnknown 포인터 획득

① IUnknown 포인터 획득

HRESULT hr = pIUnknown->QueryInterface(IID_ISetValue, (void**)&pISetValue);

② CreateInstance()함수

IUnknown* CreateInstance()
{
IUnknown* pI = static_cast( new CSimpleCalc );
pI->AddRef();
return pI;
}

3. QueryInterface()함수

HRESULT __stdcall QueryInterface(const IID& iid, void** ppv)

iid는 인터페이스의 ID 이며,
ppv는 요청한 인터페이스 포인터 내에서 QueryInterface가 위치한 주소값이다.

cf) ISetValue* pISetValue = NULL;

cf) *ppv = static_cast< ISetValue*>(this);

전체 코드는
여기에 있수다 -_-;;

QueryInterface()의 규칙
1. 컴포넌트의 인스턴스는 항상 동일한 IUnknown 인터페이스를 가진다.
그러므로 항상 클라이언트는 값은 값의 IUnknown 인터페이스 포인터를 획득한다.
2. 동일한 컴포넌트에 대해 이미 한 번 획득한 인터페이스는 계속적으로 획득할 수 있다.
즉, 인터페이스는 시간에 따라 변하지 않는다.
3. 이미 획득한 인터페이스로 동일한 인터페이스를 다시 획득하는 것은 항상 성공한다.
인터페이스의 경우 사용을 하고는 반드시 해지해 주어야 한다.
4. 인터페이스를 획득하였다면, 역으로 획득하는 것도 가능하다.
5. 인터페이스 IX로부터 IY를 획득하였고, IY로부터 IZ를 획득하였다면,
IX로부터 IZ를 획득하는 것은 항상 성공적이어야 한다.

arrow 트랙백 | 댓글



[PREV] [1][2] [NEXT]
관리자  |   글쓰기
BLOG main image
- 블로그를 처음 만들면서
분류 전체보기 (142)
기술동향 뉴스 (51)
신조어 사전 (1)
기술용어집 (5)
영상처리 기술 (29)
IT 사용정보 (7)
프로그램 기술 (23)
학술정보 (1)
생활정보 (9)
낙서장 (13)
나의 이야기 (0)
About Me (0)
Total :
Today :
Yesterday :
rss
위치로그 : 태그 : 방명록 : 관리자
multimedia's Blog is powered by Daum / Designed by plyfly.net