* ATL ActiveX 만들기 - Part1. 프로젝트 구성

요즘은 확실히 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: 클래스의 이름. VC++의 기본 naming rule인 "C"접두어를 붙여준다.
  • Coclass: COM 개체 class 이름. Short name과 동일하게 설정
  • Type: 개체 설명. 나중에 IE의 개체 추가/삭제 창에서 설명에 나올 텍스트로 사용된다.
  • Interface: COM Interface 이름.
  • ProgID: Program ID를 특별히 명시하고 싶은 경우라면 적어준다.

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

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

  • Control type: 보통은 Standard control로 설정한다. Windows Form과 비슷한 컨트롤을 작성하려면 Composite control을, DHTML을 호스팅해서 UI를 구성하려면 DHTML을 사용한다.
  • Minimal control: 최소한의 COM 인터페이스만을 구현하도록 한다. 이 예제는 IE에서만 동작하면 되므로 체크해 두었다. VB나 VC등으로 만든 다른 COM Host어플리케이션에서 사용되어야 하는 컨트롤이라면 체크하지 말자.
  • 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)을 컨테이너가 처리할 수 있도록 해 준다.

예제에서는 위의 인터페이스들을 구현했다.
기타 언급되지 않은 인터페이스에 관한 정보는 MSDN을 검색해 보시기 바란다.

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)을 추가해 보겠다.

 

다운로드

예제 프로젝트 파일(Visual Studio 2010) 관리자 모드로 컴파일한 다음 다시 읽어들일 것.

덧. 댓글이 많이 달리면 다음 포스팅이 빨라 진다던데....-_-)y-~~~

퍼가실땐 꼭 출처를 명시해 주세요. 내용 편집은 허용하지 않습니다.

Comments

  1. 채소룡 2011.02.01 16:28 address 수정/삭제 | 답글

    안녕하세요^^ 일본을 좋아하는 프로그래머 입니다~~
    ATL 관련해서 구글링 중에 여기까지 들어왔네요..
    블로그 구경하다보니 너무너무 부러운일들이 많은걸요??? 자주 놀러오겠습니다 ㅎ

  2. 박진우 2011.03.31 22:47 address 수정/삭제 | 답글

    최근 activeX에 관심이 있어서 샘플 프로젝트 부터 시작하려더 차에..
    블로거님의 정말 자세한 설명과 캡쳐화면 때문 많은 도움이 되네요~ 감사합니다.

  3. 혼하쉬 2011.06.29 16:28 address 수정/삭제 | 답글

    엑티브X 관련글이 찾기 쉽지 않던데 정말 감사 드립니다.
    그런데 채소룡님을 여기서 보다니.. 신혼생활은 어떠신지 ;;

  4. 학생 2011.07.18 11:04 address 수정/삭제 | 답글

    activeX 강좌 너무 감사합니다.
    사진도 붙여주셔서 너무 잘보고있습니다.

  5. 처음인데요 2012.04.24 16:23 address 수정/삭제 | 답글

    안녕하세요.
    포스팅 감사합니다.

    그런데 저는 ATL 컨트롤 마법사에서
    인터페이스에 IObjectSafety 가 왜 안보일까요?
    따로 추가하는 방법이 있나요?
    전 vs 2008 sp1 으로 진행하였습니다.
    감사합니다.

    • Favicon of https://greenbblog.tistory.com BlogIcon greenb75 2012.04.28 20:57 신고 address 수정/삭제

      요새 c#만 만지고 있는데다 2008은 기억이 잘 안나네요-_-; 죄송합니다.

      아마 그냥 상속/구현 목록에 적어 주시면 될 것 같은데요? class X : IObjectSafty.. 식으로...

|  1  | ···  | 50  | 51  | 52  | 53  | 54  | 55  | 56  | 57  | 58  | ···  | 77  |