컴퓨터 공부/COM&ActiveX

[6월 17일 1교시] 이벤트 1

려리군 2009. 6. 17. 15:08

이벤트

Polling : 어떤 사건이 발생했는 지 주기적으로 검사하는 방법. overhead발생.


Connection Point : Sync와 Source와 통신하기 위한 채널.

Advise할 때 (sync) 인터페이스 point를 서버에게 넘겨주고 이후 이벤트가 발생하면 Controller에게 fire한다.

※ 이벤트를 보내는 걸 fire라고 한다.


소스(source) : 이벤트를 클라이언트에게 알려주는(notification) 인터페이스.


소스 오브젝트 : 소스 인터페이스를 가진 쪽

싱크(sync) 오브젝트 : 싱크 인터페이스를 가진 쪽


1. CoCreateInstance

2. QueryInterface for IConnectionPointContainer

3. IConnectionPointContainer::FindConnectionPoint

4. Advise

5. ...

6. Unadvise


※ 소스 인터페이스는 내부 인터페이스라 클래스에서는 볼 수 없다.


실습

BEGIN_CONNECTION_POINT_MAP(CAddBack)

CONNECTION_POINT_ENTRY(__uuidof(_IAddBackEvents))

END_CONNECTION_POINT_MAP()

FindConnectionPoint가 찾는 부분.

dispatch interface
dispinterface _IAddBackEvents
{
properties:
methods:
};
※ C++에서는 dispatch interface가 수행되지 않기 때문에 dual interface로 C++용 인터페이스를 만들어 주어야 한다.

public IConnectionPointContainerImpl<CAddBack>, // ConnectionPointContainer 구현 클래스
public IDispatchImpl<IAddBack, &IID_IAddBack, &LIBID_AddBackEventLib, 1, 0>,
public IConnectionPointImpl<CAddBack, &DIID__IAddBackEvents>, // ConnectionPoint 구현 클래스
public CProxy_IAddBackEvents<CAddBack>,  // Event fire를 대행해주는 클래스

※ ConnectionPoint와 CProxy...이벤트 가 2개씩 있어야 한다.
※ 인터페이스 작성을 마쳤으면 클래스에서 '연결지점 마법사'를 수행하면 ATL이 CProxyIAddBackEvents(이벤트 관련) 코드를 생성해 준다. (이벤트 인터페이스를 수정하면 연결지점 마법사를 다시 수행해야 한다.)