반응형

요즘은 확실히 ActiveX 사용이 눈에 띄게 줄어들긴 했지만, 아직도 정신 못차리고(-_-) ActiveX를 요구하는 사람들도 가끔 있다. 아마 앞으로도 한동안은 ActiveX가 필요한 경우가 간혹 있을지도 모르니까, 방법을 다 잊어버리기 전에 요점만 정리해 두자.

 

개요

Visual C++를 이용해 ATL ActiveX를 만들어 보겠다. 작성할 어플리케이션은 그 유명한 Hello World.

이 문서에서 ActiveX를 만드는데 필요한 모든 정보를 적을 수는 없으므로(이렇게 되면 책 몇권 분량-_-) Visual C++과 Windows API, ATL에 어느정도 익숙하다는 가정하에 진행하겠다.

주요 내용은 다음과 같이 작성하려고 한다.

  • ATL기반 ActiveX를 만드는 기본적인 순서
  • Windows Vista / 7이상에서 권한 상승(Elevation)을 통해 실행되도록 하기위한 처리
  • 컨트롤에서 이벤트를 발생시키고, 이 이벤트를 처리 하기위한 Java script.

 

컨트롤 만들기

1. Visual Studio를 관리자 권한으로 실행한다.

컨트롤을 컴파일 할 때 레지스트리에 COM개체 정보를 등록하는 과정을 거치게 되는데, 일반사용자 모드에서는 권한 오류가 발생한다.

2. ATL 프로젝트를 만든다.

File - New - Project 메뉴를 클릭하고, 새 프로젝트 대화상자에서 Visual C++ - ATL Project를 선택한다. 적당한 프로젝트 이름을 입력하자.
아시다시피, 프로젝트 이름은 실행파일(DLL)의 이름으로 사용된다. 예제에서는 GreenmaruX라고했다.

우리는 웹 브라우저에서 동작하는 단순 ActiveX 컨트롤을 만들 것이므로, 기본 설정을 그대로 사용해 주면 된다.

 

3. COM 개체를 추가한다.

하나의 패키지(DLL)안에는 여러개의 COM개체를 추가할 수 있다. 물론, 일반적으로는 하나의 DLL = 하나의 ActiveX 컨트롤이지만.

하나의 컨트롤을 추가하자. 솔루션 탐색기에서 프로젝트를 선택하고 Add - Class를 클릭한다.

클래스 추가 대화상자에서 Visual C++ - ATL - ATL Control을 선택하고 Add버튼을 클릭한다.

 

4. COM 개체 설정

ATL Control wizard에서 적절한 값들을 설정해 준다. 이 단계는 크게 5단계로 구성된다.

4.1) Names: 컨트롤의 이름을 설정한다.

  • Short names: 컨트롤의 이름.
  • .h/.cpp file: 파일 이름.
  • Class: 클래스의 이름. Visual C++의 기본 naming rule인 "C"접두어를 붙여준다.
  • Coclass: COM 개체 class 이름. Short name과 동일하게 설정
  • Type: 이 개체의 설명. 나중에 IE의 개체 추가/삭제 창에서 설명에 나올 텍스트로 사용된다.
  • Interface: COM Interface 이름.
  • ProgID: Program ID를 특별히 명시하고 싶은 경우라면 적어준다.

특별한 경우가 아니라면, Short name과 Type만 적당히 입력해 주고, 나머지는 기본값을 그대로 사용하면 된다. 예제의 컨트롤 이름은 HelloCtrl이다.

4.2) Options: 컨트롤의 세부 설정을 지정한다.

  • Control type: 보통은 Standard control로 설정한다. Windows Form과 비슷한 컨트롤을 작성하려면 Composite control을, DHTML을 사용하려면 DHTML을 사용한다.
  • Minimal control: 최소한의 COM 인터페이스만을 구현하도록 한다. 이 예제는 IE에서만 동작하면 되므로 체크해 두었다. VB나 VC등으로 만든 다른 어플리케이션에서 사용되어야 하는 컨트롤이라면 체크하지 말자.
  • Connection points: 컨트롤이 외부에 이벤트를 공개해야 한다면 선택하자. 예제에서는 이벤트 사용 예제를 위해 체크해 두었다.

그 외, Aggregation, Threading model, Interface, Licensed등은 이 예제에서 다루는 수준을 넘어가는 항목들 이므로, 기본값을 그대로 사용하자.

예제에서는 Minimal Control, Connection Points를 체크했다.

 4.3) Interfaces: 컨트롤이 구현해야 할 인터페이스를 정의한다.

Minimal control을 선택했다면 구현 인터페이스 목록(Supported)이 비어있을 것이다. 대충 다음 인터페이스 정도는 구현해 두도록 하자.

  • IObjectSafety: 컨트롤이 스크립트, 초기화 등에 안전함을 컨테이너가 인식할 수 있도록 한다.
  • IPropertyNotifySink: 컨트롤에서 변경된 속성을 즉시 사용할 수 있도록 해 준다.
  • IProvideClassInfo2: 이벤트 사용을 위해서는 반드시 필요하다. Connection Point를 구현하는 경우라면 반드시 포함시키자.
  • IQuickActivate: 빠른 활성화를 위한 인터페이스인데.. 그냥 기분상(?) 구현해 두자.
  • ISupportErrorInfo: 컨트롤에서 발생한 예외(Exception)을 컨테이너가 처리할 수 있도록 해 준다.

기타, 언급되지 않은 인터페이스는 구글에서 검색해 보시기 바란다.
예제에서는 위의 인터페이스들을 모두 구현하도록 했다.

  4.4) Appearance: 컨트롤의 모양을 정의한다.

다른 항목들은 기본값을 그대로 사용하거나, 구글 검색을 해 보시고..
Based on에서는 윈도우 표준 컨트롤에서 상속받고 싶은 경우 부모 컨트롤을 선택할 수 있으니, 필요한 경우 선택한다.

예제에서는 기본값을 그대로 사용한다.

4.5) Stock Properties: 기본제공 속성 사용

대부분의 컨트롤에서 공통적으로 사용할 수 있을법한 속성들을 지원할 것인지를 결정한다. 살펴보고, 지원하고 싶은 속성이 있다면 추가해 준다. 기본 속성을 사용하는 쪽이 컨트롤 사용자(개발자) 입장에서는 일관성 있고 보다 직관적일 것이다.

예제에서는 내장 속성을 선택하지 않았다. 모두 설정했으면 Finish를 클릭해 준다.

 

컴파일 및 프로젝트 Re-load

Visual Studio의 버그일 것으로 생각되는 문제인데.. 일단 한번 컴파일 해 준 다음, 프로젝트를 닫았다가 다시 불러와야 클래스가 정상적으로 표시된다.

Build-Build Solution 해 준 다음, File - Close Solution을 클릭하자. 그리고 다시 FIle- Open을 통해 GreenmaruX.sln파일을 불러 들인다.

다음 글에서 나머지 설정과 컨트롤에 속성과 동작(Method)을 추가해 보겠다.

<원본:http://greenmaru.com/91>

반응형

+ Recent posts