■ ActiveX DLL 프로그래밍하기
비주얼 베이직을 이용한 ActiveX 프로그래밍의 여러 가지 기초에 대해서 알아보았다. 지금부터는 ActiveX 프로그래밍의 가장 첫 부분인 ActiveX DLL을 제작하는 방법에 대해서 알아보겠다. ActiveX DLL을 이용하여 제작한 컴포넌트들을 어떻게 다른 응용 프로그램에서 사용하는지, 인터넷에서의 이런 DLL 파일을 어떻게 사용하는지 앞으로의 설명들을 주의 깊게 살펴보자.
3.1 클래스의 인스턴싱(Instancing) 속성 이해하기
비주얼 베이직의 클래스 모듈로 작성된 하나의 클래스는 C++이나 Java 언어에서의 클래스와 동일한 기능을 수행할 수 있다. 클래스를 이용한 상속작업을 통한 다른 클래스를 만들 수도 있고, 클래스로부터 새로운 객체를 만들 수도 있다. 이처럼 ActiveX 프로그래밍에서 가장 중요한 역할을 수행하는 클래스 모듈에는 인스턴싱이라는 속성이 있다. 이런 인스턴싱을 이용하여 클래스의 사용범위를 제어하게 되는데 지금부터 인스턴싱이란 어떤 것인지에 대해서 알아보도록 하자.
1) 인스턴싱이란?
ActiveX EXE와 ActiveX DLL에 포함되어 있는 클래스 모듈에는 인스턴싱(Instancing)이라는 속성이 있다. 인스턴싱 속성은 클래스의 인스턴스를 외부 프로그램에서 생성할 때 어떻게 사용권한을 부여할 것인지를 설정하는 중요한 속성이다. 예를 들어 표준 EXE의 경우에는 자기 컴퓨터에서만 실행될 응용 프로그램을 제작하는 경우이므로 내부에 포함하고 있는 개체들의 인스턴싱은 기본적으로 Private이지만 ActiveX EXE와 ActiveX DLL의 경우에는 Instancing 속성을 설정할 수 있도록 제공하고 있다. 그러나 이런 인스턴싱의 속성에도 여러 가지 종류들이 있어 개발자는 자기가 사용하고자 하는 클래스의 성격에 맞게 인스턴싱 속성을 다르게 설정하여야 하는 문제가 발생한다. 다음에 설명하는 여러 가지 인스턴싱의 속성에 대해서 알아보도록 하자.
2) 인스턴싱의 종류
ActiveX EXE 프로젝트를 수행하여 나오는 클래스 모듈의 속성에 있는 Instancing은 비주얼 베이직에서 제공하는 6가지의 인스턴싱 속성의 종류들이 있다. 이와 같은 Instancing 속성 기본 값은 프로젝트 종류에 따라 달라진다. Private은 표준 EXE 프로젝트의 클래스 모듈에만 해당하는 기본 값이다. ActiveX EXE 프로젝트 또는 ActiveX DLL 프로젝트에 새로운 클래스 모듈을 삽입할 경우 Instancing 속성의 기본 값은 MultiUse이다. ActiveX Control 프로젝트에 새로운 클래스 모듈을 삽입할 경우 Instancing 속성의 기본 값은 PublicNotCreatable이 된다. 이런 인스턴싱 속성이 각각 어떤 역할을 수행하는지 알아보도록 하자.
① Private
클래스의 인스턴싱이 Private로 설정되어 있으면 이 클래스는 한 프로젝트 내에서만 사용이 가능하게 된다. 즉 다른 응용 프로그램은 클래스에 대한 형식 라이브러리 정보를 사용할 수 없으며, 그 인스턴스를 만들 수가 없게된다.
[그림 1-4] Private 인스턴싱 모델
② PublicNotCreatable
다른 응용 프로그램은 구성 요소가 먼저 개체를 만드는 경우에만 클래스의 개체를 사용할 수 있지만, 클래스에서 개체를 만들기 위해 CreateObject 함수 또는 New 연산자를 사용할 수 없다. 즉 클라이언트에서는 컴포넌트에 의해 이미 생성된 인스턴스에 접근하여 사용할 뿐 새로운 인스턴스를 생성할 수 없는 것이다. 만일 이 클래스를 클라이언트에서 사용하고자 할 경우에는 인스턴싱 속성이 공용으로 설정되어 있는 클래스를 통해서만 가능하게 된다.
③ SingleUse
다른 응용 프로그램이 클래스에서 개체를 만들 수 있도록 허용하지만 클라이언트가 만든 이 클래스의 모든 개체는 구성 요소의 새로운 인스턴스를 만들게 된다. 이처럼 인스턴스를 생성할 때마다 새로운 개체가 생성되기 때문에 하나의 개체 안에 두 가지 이상의 SingleUse 클래스가 포함되면 정상적으로 프로그램이 동작하지 않는 경우가 발생하게 된다.
④ GlobalSingleUse
클래스의 속성과 메서드가 오직 전역 함수인 것처럼 불러올 수 있다는 것을 제외하면 SingleUse와 비슷합니다.
⑤ MultiUse
다른 응용 프로그램이 클래스에서 개체를 만들 수 있도록 허용한다. 구성 요소의 한 인스턴스는 개체를 만들려는 응용 프로그램 수에 상관없이 이러한 방법으로 몇 개의 개체든 만들 수 있다.
⑥ GlobalMultiUse
MultiUse와 비슷하며 한 가지가 추가된다. 즉, 클래스의 속성과 메서드가 오직 전역 함수인 것처럼 불러올 수 있다. 클래스의 인스턴스가 자동으로 만들어지므로, 먼저 인스턴스를 만들 필요는 없다.