컴퓨터 공부/COM&ActiveX

[6월 16일 1교시] 자동화(automation)

려리군 2009. 6. 16. 09:58

C와 C++은 포인터 및 가상테이블을 통해서 객체에 접근할 수 있지만...

스크립트 언어에서도 객체에 접근할 수 있는 방법을 제공해야 한다.

예 : 스크립트 언어에서 객체 사용법 

<object id="CLSID" base="URL">


자동화

Automation Component : 자동화 서버

Automation Controller : 자동화 클라이언트


Method : operation(기능)

Property : 상태 정보. 하나의 변수로 나타낼 수 있다. get과 set할 수 있다.

Event : component가 controller에게 알려준다. (fire)


장점 

스크립트 언어를 사용하는 응용 프로그램에서도 자동화 개체 접근 가능.

Proxy/Stub DLL 불필요

단점

실행 속도 느림 -> 이중 인터페이스

데이터형의 제한(BSTR과 VARIENT)


IDispatch 인터페이스

GetTypeInfoCount

GetTypeInfo

GetIDsOfNames(NULL, 구하고자 하는 메소드 속성명, 배열 수(보통 1), locale, out:DISPID)

Invoke(in:DISPID, NULL, locale, in:호출할 형태(4), 매개변수, 리턴된 결과, 예외상황 정보, 에러 매개변수 인덱스)

호출할 형태

DISPATCH_METHOD(메소드)

DISPATCH_PROPERTYGET(속성 읽기)

DISPATCH_PROPERTYPUT(속성 쓰기)

DISPATCH_PROPERTYPUTREF




interface IAddBack : IDispatch{

[id(1), helpstring("메서드 Add")] HRESULT Add(void);

[propget, id(2), helpstring("속성 AddEnd")] HRESULT AddEnd([out, retval] SHORT* pVal);

[propput, id(2), helpstring("속성 AddEnd")] HRESULT AddEnd([in] SHORT newVal);

};

※ 위의 idl파일의 id 숫자 값이 DISPID값이 된다.


사용예

obj.prop = propValue  // putValue 자동 호출

obj.Method

※ prop이나 Method를 통해 GetIDsOfNames을 호출하여 DISPID를 얻어내고 이 DISPID를 통해 Invoke함수를 수행한다.

Dual Interface

IDispath::Invoke함수로도 호출이 되고 가상함수 테이블(Custom Interface 호출방법과 동일)을 통해서도 호출이 가능하도록 제공하는 인터페이스
561P 그림 참고

Late Binding

자동화 컨트롤러가 실행 시간에 자동화 개체의 속성이나 메소드와 binding

실행시간에 동적으로 자동화 개체의 기능을 결정

일반적인 스크립트 언어에서 사용하는 방법


Early Binding(ID Binding, VTable Binding)
컴파일시에 속성과 메소드, 매개변수의 수와 데이터 형을 검사(미리 검사)
실행시 GetIDsOfNames을 실행시 호출할 수 없다.

Type Library
COM 개체에 대한 정보를 저장하고 있는 이진 파일

자동화 데이터형 
컨트롤러와 컴포넌트 사이에 오고가는 데이터 제약
장점 : marshalling이 단순해져 프로그래밍 부담이 적다.

VARIENT 데이터형

사용예시

VARIENT vVal;

VariantInit(&vVal);

vVal,vt = VT_BOOL; // 타입 지정

vVal.boolval = 값;


BSTR
문자열의 표준

사용예시

wchar_t szStr[] = L"This is Right.";

BStr bstr;

bstr = SysAllocString(szStr);


IDispatchImpl
이중 인터페이스 지원, IDispatch 인터페이스 메소드의 디폴트 구현 코드 제현