ActiveX

ATL을 이용하여 ActiveX 컨트롤 만들기

디버그정 2008. 7. 29. 13:57

ATL을 이용하여 ActiveX 컨트롤 만들기

ATL(Active Template Library)

COM 객체 작성에 필요한 코드들이 구현되어 있는 C++ 템플릿 클래스들의 집합입니다. ATL을 이용하여 ActiveX 컨트롤을 개발하면 MFC를 이용하여 개발하는 것과 비교해 크기를 6배 정도 작게 할 수 있습니다. Visual Studio 에서는 ATL 컨트롤 마법사 같은 여러 ATL 마법사를 제공하여 ActiveX 컨트롤 개발을 더욱 쉽게 해줍니다.

  • COM(Component Object Model) : 컴포넌트 - 자신의 고유한 기능을 제공하는 단위 어플리케이션 - 간의 통합 및 통신 방법에 대한 표준을 정의한 사양
  • 인터페이스 : COM 객체가 자신의 기능을 노출시키는 방법. 하나 이상의 메소드를 제공해야 함.
  • GUID(Global Unique Identifier) : 시간과 장소에 관계없이 전세계적으로 유일함을 보장하는 128비트 값. COM 객체와 인터페이스들을 식별하는데 사용함.

ActiveX 컨트롤은 실제로는 COM 객체의 다른 이름일 뿐입니다.

개발 순서

이 문서에서는 간단한 ActiveX 컨트롤을 만들어보겠습니다. 만들 컨트롤의 기능은 다음과 같습니다.

  • IE 에서 인자로 넘겨준 문자열을 ActiveX에서 메시지 박스로 표시함
  • ActiveX 내에서 더블클릭한 좌표를 IE로 넘겨줌

개발 환경은 Windows XP에 Visual Studio 2005 한글판 을 기준으로 하였습니다.

프로젝트 및 컨트롤 생성

ATL을 이용하는 sample 이라는 프로젝트를 생성하고 Dooly 라는 ActiveX 컨트롤을 생성하도록 합니다.

그림 1 과 같이 ATL 프로젝트를 생성하고 이후 뜨는 다이얼로그에서는 그냥 마침 버튼을 클릭하면 됩니다.

images/activex_project1

그림 1. ATL 프로젝트 생성

Dooly 라는 ActiveX 컨트롤을 추가하도록 하겠습니다. 다음 그림 순서대로 클래스를 생성을 합니다.

images/activex_project2

그림 2. ATL 컨트롤 선택

images/activex_project3

그림 3. 이름 지정

images/activex_project4

그림 4. 옵션 선택

images/activex_project5

그림 5. 지원할 인터페이스 선택

images/activex_project6

그림 6. 모양 지정

images/activex_project7

그림 7. 파일 목록

그림 7 은 컨트롤 추가가 완료된 후 프로젝트에 추가된 파일 목록입니다.

  • dooly.bmp : ActiveX 컨트롤 아이콘
  • dooly.rgs : Dooly COM 객체가 등록/해제 될때 레지스트리에 추가/삭제될 설정들
  • sample.rgs : DLL이 등록/해제 될때 레지스트리에 추가/삭제될 설정들
  • sample.cpp : DLL 시작/종료 함수인 DllMain()이 구현되어 있는 소스 코드
  • sample.idl : 프로젝트내의 모든 객체들의 인터페이스를 정의하는 IDL(Interface Definition Language) 소스 코드. 이 파일로 부터 sample.h, sample_i.c, sample_p.c, dlldata.c 이 생성됨.
  • dooly.cpp, dooly.h : Dooly 컨트롤 구현 코드

메소드 추가

ActiveX 컨테이너에서 호출할 수 있는 ActiveX 컨트롤의 메소드를 추가합니다. 클래스 뷰에서 IDooly 를 선택한 후 팝업 메뉴에서 추가 -> 메소드 를 실행하여 그림 8 과 같이 메소드를 추가합니다.

images/activex_method1

그림 8. 메소드 추가 GUI

확인을 누르면 .idl, .h, .cpp 파일에 메소드의 선언과 정의 부분이 추가됩니다. 실제 메소드 구현에는 그림 9 과 같이 IE 로부터 넘겨받은 문자열을 대화 상자로 출력하는 코드를 추가합니다.

images/activex_method2

그림 9. 메소드 구현

BSTR 은 ActiveX 컨테이너와 문자열을 주고 받을때 사용하는 타입입니다. 기존에 사용하던 문자열 함수를 사용하기 위해선 _bstr_t 로 변환을 해야하는데 _bstr_t 를 사용하기 위해선 comutil.h 를 인클루드 하고 comsuppw.lib 를 링크시켜야 합니다.

이벤트 구현

ActiveX 컨트롤에서 이벤트를 발생시키는 기능을 추가합니다. sample.idl 파일에서 그림 10 과 같이 직접 DoubleClicked 라는 이벤트 메소드를 추가합니다.

images/activex_evt1

그림 10. 이벤트 메소드가 추가된 sample.idl

클래스 뷰에서 Dooly 클래스를 선택한 후 팝업 메뉴에서 추가 -> 연결 지점 추가 를 실행하여 그림 11 과 같은 상태로 만듭니다.

images/activex_evt2

그림 11. 연결 지점 구현 마법사

위 그림에서 마침을 클릭하면 클래스뷰에 CProxy_IDoolyEvents<T> 라는 클래스가 추가되는데 이 클래스에 DoubleClicked 이벤트를 발생시키는 메소드가 구현되어 있습니다. 그리고 Dooly 클래스에서 호출할 수 있도록 Dooly 클래스가 CProxy_IDoolyEvents<T> 클래스를 상속받게 됩니다.

이제 사용자가 실제로 더블 클릭을 했을때 DoubleClicked 이벤트를 발생시키도록 코드를 추가하겠습니다. dooly.h를 그림 12 와 같이 수정하여 더블 클릭시 발생하는 윈도우 메시지와 핸들러를 연결합니다.

images/activex_evt3

그림 12. 더블 클릭 메시지 핸들러 선언

핸들러 구현에서는 더블 클릭한 좌표를 문자열로 만들어 DoubleClicked 이벤트를 발생시킬때 인자로 같이 전달합니다. Fire_DoubleClicked() 함수는 Dooly 클래스의 부모 클래스인 CProxy_IDoolyEvents<T> 클래스에 구현된 이벤트를 발생시키는 함수입니다.

images/activex_evt4

그림 13. 더블 클릭 메시지 핸들러 구현

빌드

컨트롤의 안전성을 보장하기 위해 다음과 같이 IObjectSafty 인터페이스 구현을 추가합니다. 이 항목을 추가하지 않으면 컨트롤의 메소드가 실행될때나 이벤트가 발생할때 IE 에서 경고 메시지가 발생합니다.

images/activex_etc2

그림 14. IObjectSafty 인터페이스 구현이 추가된 dooly.h

그리고 레지스트리 설정 파일을 그림 15 대로 수정하여 레지스트리에 등록될때 안전하다는 정보도 같이 저장하게 합니다.

images/activex_etc3

그림 15. 안전 정보가 포함된 dooly.rgs

모든 COM 객체는 레지스트리에 등록함으로서 다른 프로그램에서 CLSID만으로 해당 객체을 사용할수 있도록 합니다. 프로젝트 속성에 다음과 같이 추가하면 빌드가 완료될때마다 자동으로 레지스트리에 등록하여 테스트를 편하게 해줍니다.

images/activex_etc1

그림 16. 자동 등록 사용자 빌드 단계 추가

이제 빌드하면 ActiveX DLL 이 생성되고 자동으로 레지스트리에 등록됩니다. 배포를 위한 실행시에는 빌드 설정을 Release로 바꿔야 합니다. Release 빌드시에는 다른 DLL에 의존성을 가지지 않도록 빌드 속성의 런타임 라이브러리 설정을 다중 스레드 DLL 에서 다중 스레드 로 변경합니다.

배포 및 실행

생성한 ActiveX 컨트롤을 웹 서버에 올려서 클라이언트 PC의 IE 에서 다운로드하고 실행할 수 있도록 하는 방법입니다. ActiveX DLL과 inf파일을 CAB 파일 형태로 묶어서 웹서버에 업로드해야 합니다. 먼저 다음과 같이 dooly.inf 파일을 작성합니다.

; dooly.inf
[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
dooly.dll=dooly.dll

[dooly.dll]
file=thiscab
clsid={98749C00-A351-4920-8616-6E44BA65E39F}
RegisterServer=yes
FileVersion=1,0,0,1

이미 클라이언트 PC에 같은 ActiveX 컨트롤이 설치된 경우 FileVersion을 비교하여 높은 버전인 경우에만 다운로드 하여 설치하게 됩니다. ActiveX 컨트롤의 버전은 그림 17 과 같이 빌드하기 전에 지정합니다.

images/activex_dist1

그림 17. Dooly 컨트롤 버전 편집

다음 명령으로 dooly.dll 과 dooly.inf 파일을 묶어서 dooly.cab 파일을 만듭니다.

CABARC -s 6144 N dooly.cab dooly.dll dooly.inf

발급받은 SPC 파일과 키 파일(pvk파일) 이 있는 경우 다음 명령으로 CAB 파일에 디지털 서명을 추가할 수 있습니다.

SIGNCODE -spc dooly.spc -v dooly.Pvk -n "Dooly Control 1.0" -t http://timestamp.verisign.com/scripts/timstamp.dll dooly.cab

SPC 파일이 없거나 테스트용 인증기관에서 발급받지 않은 SPC파일을 사용하는 경우 IE 에서 CAB 파일을 다운로드할때 보안 레벨에 따라서 다운로드를 하지 않는 경우가 있습니다. 이 경우에는 IE의 보안 옵션에서 서명 안 된 ActiveX 컨트롤 다운로드 항목의 설정값을 확인으로 바꿔주시면 됩니다.

Dooly 컨트롤을 테스트 하기 위해 테스트용 html 파일을 만들어 dooly.cab 파일과 dooly.inf 파일과 함께 웹서버에 올립니다.

<head>
<title>ActiveX TEST</title>
<script language="javascript">

function mineral()
{
  dooly.ShowMessage("Show me the money");
}

</script>

<script for="dooly" EVENT='DoubleClicked(pos)' language='javascript'>
alert(pos)
</script>

</head>

<body>

<OBJECT id=dooly codeBase=http://demo.emstone.com/test/dooly.cab#version=1,0,0,1 width=320 height=240 classid=CLSID:98749C00-A351-4920-8616-6E44BA65E39F></OBJECT>

<p>

<input type="button" value="Mineral" onclick="mineral();">

</body>
</html>

이제 IE 에서 해당 주소로 접속하여 Dooly 컨트롤을 테스트 할 수 있습니다.

images/activex_dist2

그림 18. Dooly 컨트롤 버전 편집

디버깅

IE 에서 ActiveX 를 테스트하는 도중 Visual Studio로 디버깅을 하고 싶은 경우는 다음과 같은 방법이 있습니다.

images/activex_debug1

그림 19. IE 프로세스를 디버그

작업 관리자를 실행시킨 후 ActiveX 컨트롤이 실행되고 있는(또는 실행될) IE 프로세스에 대해서 디버그를 실행합니다.

images/activex_debug2

그림 20. Visual Studio 선택

디버그할 ActiveX 프로젝트가 열려있는 Visual Studio를 선택합니다. 그러면 해당 IE 프로세스에 대해서 디버거가 시작되고 이후부터 브레이크 포인트를 건다거나 잠시 멈춰놓고 메모리를 살펴보는 등의 디버깅 작업을 할 수 있습니다.

만약 ActiveX가 디버그 설정으로 빌드된것이 아니라면 소스 코드가 제대로 보이지 않습니다. 디버그 설정으로 빌드를 하여 레지스트리에 해당 ActiveX의 CLSID가 가르치는 DLL이 디버그 설정으로 빌드된 DLL을 가르키도록 해야합니다.