3. Implementation/COM & ActiveX

자동화와 이중 인터페이스

SSKK 2008. 10. 11. 01:14

IDispatch 인터페이스

 

interface IDispatch : public IUnknown

{

public:

virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT * pctinfo) = 0;

virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(

UINT iTInfo,

LCID lcid,

ITypeInfo ** ppTInfo) = 0;

virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(

REFID riid,

LPOLESTR * rgszNames,

UINT cNames,

LCID lcid,

DISPID * rgDispId) = 0;

virtual HRESULT STDMETHODCALLTYPE Invoke(

DISPID dispidMember,

REFID riid,

LCID lcid,

WORD wFlags,

DISPPARAMS * pDispParams,

VARIANT * pVarResult,

EXCEPTINFO * pExcepInfo,

UINT *puArgErr) = 0;

}

 

Visual Basic 자동화 컨트롤러 애플리케이션 코드에서 어떻게 이들 메서드를 사용하는지 알아 보자.

 

dim obj As Object

 

set obj = CreateObject(“AddBack.AddBack.1”)

obj.Prop = propValue

obj.Method

 

set obj = CreateObject(“AddBack.AddBack.1”)

à CLSIDFromProgID 함수 호출

“AddBack.AddBack.1” -> CLSID 로 변환

à CoCreateInstance 함수 호출

자동화 객체 인스턴스 생성

IDispatch 인터페이스 포인터를 obj에 저장

 

obj.Prop = propValue

à GetIDsOfNames 메서드 호출

PropDISPID 값 구함

à Invoke 함수 호출 (DISPID를 매개변수로)

 

obj.Method

à GetIDsOfNames 메서드 호출

Method DISPID 값 구함

à Invoke 함수 호출 (DISPID를 매개변수로)

 

자동화 객체

IDispatch 인터페이스를 통하여 메서드나 속성을 노출시키기는 하지만 직접 기능을 노출시키는 것은 아님

à 대신, Invoke 함수를 통하여 자동화 컨트롤러에게 메서드와 속성을 노출시킴

 

GetIDsOfNames 함수로 구한 DISPID를 매개변수로 Invoke 함수를 호출한다. 이때 Invoke 함수는 switch 문을 사용하여 매개변수로 넘어온 DISPID에 대응되는 case 문 코드 블록을 실행하게 구현할 수도 있다.

 

디스패치 인터페이스 (dispatch interface, dispinterface)

IDispatch::Invoke 함수에 의하여 구현되는 함수 포인터 배열 dispatch interface 또는 dispinterface 라고 한다.

 

구조를 그림으로 나타내면 다음과 같다.


 

dispinterface COM 인터페이스가 아니다. 디스패치 인터페이스는 COM 인터페이스와 달리 가상 함수 테이블의 처음 세 개의 요소에 QueryInterface, AddRef, Release 함수 포인터가 저장되지 않는다. 그러나 물론, COM 인터페이스를 사용하여 dispinterface를 구현할 수도 있다.

 

이중 인터페이스 (Dual Interface)

자동화 객체는 IDispatch 인터페이스 외에도 이와 동일한 역할을 하는 커스텀 인터페이스를 함께 제공함으로써, 일반적인 COM 인터페이스에 접근할 수 있는 언어에서도 효율적으로 서비스를 사용할 수 있게 된다.

 

이중인터페이스?

IDispatch::Invoke 함수를 통하여 사용할 수 있는 모든 함수를 인터페이스 테이블 즉, 가상 함수 테이블(vtable)을 통해서도 직접 사용할 수 있게 하도록 구현된다.

 

이중 인터페이스의 구조를 그림으로 나타내면 다음과 같다.

 


 

이중 인터페이스는

l  C++ 프로그램이 가상 함수 테이블을 통하여 직접 함수를 호출함으로써 더욱 빨리 실행함 수 있게 함과 동시에,

l  매크로 언어에서는 IDispatch 인터페이스의 Invoke 함수를 통하여 함수를 호출할 수 있게 하는 효율성을 제공한다.


참고 : 전병선의 Component Development with Visual C++ & ATL