자동화에 대한 기본 정리

자동화(Automation)란?

COM은 언어에 독립적입니다. 따라서 COM 인터페이스로 만든 소프트웨어 컴포넌트은 어떤 언어에서든 사용이 가능합니다.

하지만, 스크립트 언어는 예외입니다. 스크립트 언어는 일반적인 COM 인터페이스에 접근하지 못합니다. 그래서, 스크립트 언어가 이해할 수 있는 IDispatch라는 특별한 COM 인터페이스를 정의하였습니다. IDispatch라는 COM 인터페이스는 스크립트 언어 뿐만 아니라 COM을 지원하는 모든 언어가 사용할 수 있는 아주 범용적인 인터페이스인데, 이를 이용하여 소프트웨어 컴포넌트들이 서로의 기능을 공유하는 것을 자동화라고 합니다.

자동화 인터페이스의 가장 큰 장점은 C++와 같은 컴파일 언어 뿐 아니라 스크립트 언어를 이용해서도 사용이 가능한 소프트웨어 컴포넌트를 만들 수 있다는 것입니다. 물론, 이러한 범용성을 대가로 약간의 성능을 희생해야만 합니다. 스크립트 언어가 이해할 수 있는 방식으로 메서드를 호출하다 보니, 일반 COM 인터페이스에 비해 약간의 오버헤드가 있을 수 밖에 없는 것이죠. 그래서 이중인터페이스라는 것을 제공하여, 일반 스크립트 언어에서는 IDispatch 인터페이스를 이용하여 메서드를 호출하고, C++과 같은 언어에서는 이중 인터페이스를 이용하여 메서드를 호출하는 방식을 사용하죠.

자동화도 COM 응용 기술의 하나이기 때문에 서버와 클라이언트의 개념이 존재합니다. 자동화를 지원하는 COM 서버를 자동화 서버 또는 자동화 컴포넌트라고 합니다. 즉, 자동화 서버는 스크립트 언어나 다른 프로그램이 사용할 수 있는 기능들을 제공해 줍니다. 자동화 서버의 기능을 이용하는 프로그램을 자동화 클라이언트라고 합니다.

 

자동화의 동작

일반적인 COM 오브젝트는 클라이언트가 서버로부터 인터페이스 포인터를 얻은 후, 그 인터페이스를 통해 노출된 메서드를 호출합니다.

그러나, 스크립트 언어는 일반적인 COM 인터페이스의 구조를 인식하지 못하기 때문에 스크립트 언어의 접근을 허용하기 위해서 IDispatch라는 특별한 인터페이스를 만든 것입니다. IDispatch 인터페이스를 이용한 자동화의 가장 중요한 특징은 클라이언트에서 호출하는 자동화 메서드가 인터페이스에 드러나있지 않다는 것입니다. 그 대신 IDispatch 인터페이스의 Invoke라는 메서드가 외부로 드러나 있고, 클라이언트는 Invoke라는 메서드를 통해 자동화 메서드를 간접적으로 호출합니다.

자동화 메서드는 DISPID라는 일련번호를 가지고 있고, 이 일련번호를 매개변수로 하여 IDispatch 인터페이스의 Invoke 메서드를 호출함으로써 그에 해당하는 자동화 메서드를 실행할 수 있도록 되어 있습니다. 이러한 방식을 사용하면 자동화 메서드 뿐 아니라 속성에도 쉽게 접근할 수 있습니다.

Invoke 메서드는 자동화 메서드를 호출하기 위해 자동화 메서드에 할당된 DISPID라는 일련번호를 매개변수로 넘겨 받습니다. 이 일련번호는 GetIDsOfNames 메서드를 이용하면 구할 수 있습니다. 이 메서드는 호출하고자 하는 자동화 메서드의 이름을 매개변수로 받아 그 메서드의 DISPID를 넘겨줍니다.

 

타입 라이브러리

자동화 서버가 아무리 좋은 기능을 제공하더라도, 그것이 어떤 기능을 제공하는지 모르면 사용할 수 없겠죠. 자동화 서버의 기능을 클라이언트가 사용할 수 있도록 하려면 서버가 제공하는 기능들에 대한 정보가 필요합니다.

이러한 정보를 제공하는 방법으로 타입 라이브러리라는 것을 이용합니다. 타입 라이브러는 .tlb 도는 .olb라는 확장자를 가지며, 경우에 따라서는 별도의 파일이 아닌 COM 서버의 DLL이나 EXE 자체에 내장되기도 합니다.

타입 라이브러리를 만들기 위해서는 먼저 C++의 헤더 파일과 비슷한 문법을 가진 IDL(Interface Definition Language)이라는 언어를 사용하여 COM 서버가 제공하는 기능을 기술합니다. 이 내용은 확장자가 .idl인 파일에 저장되고, 이를 MIDL 컴파일러라는 툴을 이용하여 컴파일 하면 바이너리 형태의 타입 라이브러리가 생성됩니다.

 

MFC의 자동화 지원

MFC는 IDispatch 인터페이스의 서버측 기능을 구현해 놓은 CCmdTarget 클래스와 클라이언트측 기능을 구현해 놓은 COleDispatchDriver 클래스를 제공합니다. 따라서, 우리는 IDispatch 인터페이스의 기능을 직접 구현하기 우해 노력하지 않아도 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다