컴퓨터 공부/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(이벤트 관련) 코드를 생성해 준다. (이벤트 인터페이스를 수정하면 연결지점 마법사를 다시 수행해야 한다.)