액티브X 컨트롤의 사용과 제작

Similar documents
PowerPoint Template

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

C# Programming Guide - Types

PowerPoint Presentation

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

COM의 기초 개념

고급 COM 기술의 활용 (II)

ISP and CodeVisionAVR C Compiler.hwp

gnu-lee-oop-kor-lec06-3-chap7

Dialog Box 실행파일을 Web에 포함시키는 방법

델파이 4 프로그래밍의 이해 (Understandings of Delphi 4 Programming)

SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES ActiveX 컴포넌트가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Secure Programming Lecture1 : Introduction

쉽게 풀어쓴 C 프로그래밍

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

Microsoft Word - src.doc

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

슬라이드 1

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap01-C언어개요.pptx

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

PowerPoint Presentation

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

View Licenses and Services (customer)

 메소드 오버로딩

JDK이클립스

PowerPoint Presentation

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

어댑터뷰

NTD36HD Manual

No Slide Title

Install stm32cubemx and st-link utility

이것이 델파이 4

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

BEA_WebLogic.hwp

Visual Basic 반복문

슬라이드 1

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

PowerPoint Presentation

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

Visual Basic Visual Basic 소개

Microsoft PowerPoint - Chapter 6.ppt

C++ Programming

4S 1차년도 평가 발표자료

Chapter #01 Subject

제11장 프로세스와 쓰레드

Studuino소프트웨어 설치

MF5900 Series MF Driver Installation Guide

Interstage5 SOAP서비스 설정 가이드

오버라이딩 (Overriding)

DLL(Dynamic Linked Library)

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

17장 클래스와 메소드

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

고급 COM 기술의 활용

Microsoft PowerPoint - chap10-함수의활용.pptx

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

Spring Boot

MVVM 패턴의 이해

gnu-lee-oop-kor-lec10-1-chap10

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

설계란 무엇인가?

Microsoft PowerPoint - e pptx

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F32C2F7BDC32E >

Microsoft PowerPoint - CSharp-10-예외처리

Javascript

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

구조화 저장소 기법

MF3010 MF Driver Installation Guide

Flex Builder 2 & 차트

11장 포인터

델파이 4 IDE의 내부 (Internals of Delphi 4’s IDE)

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault

윈도우시스템프로그래밍

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

로거 자료실

Splentec V-WORM Quick Installation Guide Version: 1.0 Contact Information 올리브텍 주소 : 경기도성남시분당구구미로 11 ( 포인트타운 701호 ) URL: E-M

Transcription:

액티브 X 컨트롤, 액티브폼의제작 (Creating ActiveX Controls, ActiveForms) 델파이의 VCL 컴포넌트와액티브 X 컴포넌트는사실의미상으로많은부분이통하지만, 실제구현방법은많은차이가있기때문에 VCL 컨트롤을액티브 X 컨트롤로전환개발하려면사실많은단순작업을해주어야한다. 델파이 4 에서는이런작업을단순화시키는레이어를제공하는데이것이바로액티브 X 컨트롤위저드이다. 마찬가지로컴포넌트가추가된폼을하나의액티브 X 컨트롤처럼사용할수있는데, 이를액티브폼이라고하며액티브폼역시델파이 4 에서제공되는액티브폼위저드를이용해서쉽게작성할수있다. 액티브 X 컨트롤에대한내용의경우필자가가장많이참고한자료는 97 년도에볼랜드가개최한컨퍼런스에서 Conrad Herrman 이발표한컨퍼런스자료이다. Conrad Herrman 은 inprise 에서운영하는뉴스그룹에서도액티브 X 분야에서가장활발한활동을하고있는사람으로 inprise 와관련이없는데에도불구하고, 어려운질문에도즉각즉각답변을해주는사람이다. 아마도이글을읽을기회는없겠지만이자리를빌어감사의뜻을전하고싶다. 액티브 X 컨트롤위저드의이용 사용하는것은간단하지만, 위저드가내부적으로동작하는방법을간단하게설명하겠다. 먼저자동화인터페이스와이벤트인터페이스를지정하고, 구현할객체의클래스 ID 를생성한다. 그리고나서이객체를액티브 X 서버라이브러리에서사용할수있도록포장해준다. 이과정에서 VCL 컴포넌트의프로퍼티, 메소드, 이벤트를 OLE 스타일로변환시켜주는짧은어댑터루틴이필요하다. 실제로액티브 X 컨트롤위저드를사용해보자. 1. TWinControl 에기초한정상적인델파이컨트롤을빌드하고, 이를컨트롤팔레트에인스톨한다. 여기에서는델파이 TEdit 를이용하겠다. 이컴포넌트를액티브 X 컨트롤로만들면다른개발도구에서도유용하게사용할수있을것이다. 2. File New 메뉴를선택하고, 여기에서 ActiveX 페이지를선택하면액티브 X 제작과관련한여러가지마법사를볼수있는데, ActiveX Control 아이템을선택하면다음그림과같은대화상자가나타난다. 3. VCL Class Name 항목에는액티브 X 컨트롤로전환시킬 VCL 클래스를선택하면자동으로아래의 3 항목이채워진다. 이를그대로사용해도좋고, 다른이름으로바꿀수도있다. 참고로각각의항목은새로운액티브 X 컨트롤클래스의이름, 컨트롤을구현하는

Unit 파일, 액티브 X 서버라이브러리프로젝트파일을지정한다. 4. 적절한쓰레딩모델을선택한다. 보통은 Apartment 모델을사용한다. 앞장에서여기에대해서는자세히설명하였으므로, 이를참조하기바란다. 5. 대화상자하단의옵션체크박스는나중에설명하기로하고, 여기서 OK 를누르면위저드는액티브 X 컨트롤을구현하는코드와이를담을액티브 X 서버라이브러리프로젝트파일을자동으로생성하거나수정한다. 6. 프로젝트를빌드하면액티브 X 컨트롤이만들어진다. 7. 마지막으로만들어진컨트롤을시스템에등록해야하는데, Run Register ActiveX Sever 메뉴를선택하면등록이완료된다. 액티브 X 컨트롤위저드대화상자 TEdit 의경우액티브 X 컨트롤위저드에의해 EditXControl1.dpr 파일과액티브 X 서버를 구현하는 EditXImpl1.pas 파일, 프로젝트에 import 되는타입라이브러리파일 (.tlb) 과타입 라이브러리의파스칼버전이생성된다. 액티브 X 프로젝트파일 위저드에의해생성되는프로젝트파일의내용을살펴보자. 소스코드는다음과같다. 이 해를돕기위해필자가주석을달았다. library EditXControl1; uses //EditXControl1 이라는 DLL 파일을생성하는프로젝트임을나타냄

ComServ, EditXControl1_TLB in 'EditXControl1_TLB.pas', EditImpl1 in 'EditImpl1.pas' {EditX: CoClass}; //EditX 라는액티브 X 클래스를구현하는 unit 가 EditXImpl1.pas 파일에구현되어있음을나타내는줄 {$E ocx} // 링커에게 output 파일의확장자가.ocx 임을알려준다. exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; // 표준액티브 X 서버함수를 export. 이함수들은 ComServ unit 에구현되어있으므로, 따로구현할필요가없다. {$R *.TLB} // 링커에게타입라이브러리파일을 DLL 의리소스로포함할것을요구한다. {$R *.RES} // 링커에게프로젝트의리소스를포함할것을요구한다. 여기에는툴바비트맵과 버전정보리소스가포함된다. end. 액티브 X 컨트롤러객체의선언 실제로액티브 X 컨트롤의구현부분은 EditXImpl1.pas 파일에담겨져있다. 이파일에는액티브 X 컨트롤의액티브 X 컨트롤러객체가구현되어있으며, 액티브 X 컨트롤러객체에의해자동화인터페이스가정의되고, OLE 자동화스타일의프로퍼티, 메소드, 이벤트가구현된다. 주요소스를살펴보자. unit EditImpl1; interface uses Windows, ActiveX, Classes, Controls, Graphics, Menus, Forms, StdCtrls, ComServ, StdVCL, AXCtrls, EditXControl1_TLB;

EditXControl1_TLB.pas unit 은파스칼버전의타입라이브러리로여기에인터페이스가정 의되어있다. 위저드에의해생성된다. type TEditX = class(tactivexcontrol, IEditX) // 타입라이브러리에정의된 IEditX 인터페이스를구현하는컨트롤러객체인 TEditX 클래스를 TActiveXControl 클래스에기초하여선언 private { Private declarations } FDelphiControl: TEdit; //VCL 컨트롤을가리키는필드. InitializeControl 메소드에의해초기화된다. 아래에열거되는멤버들을이용하여프로퍼티, 메소드등에접근한다. FEvents: IEditXEvents; // 컨테이너의이벤트싱커에대한포인터이다. 일종의 dispinterface 로 IDispatch 포인터를저장한다. 이값은컨트롤이컨테이너에삽입되거나제거될때 EventSinkChanged 메소드가호출되면설정된다. 이값이 nil 일수도있는데, 이는컨테이너애플리케이션이이벤트에대한처리를하지않는경우이다. procedure ChangeEvent(Sender: TObject); procedure ClickEvent(Sender: TObject); procedure DblClickEvent(Sender: TObject); procedure KeyPressEvent(Sender: TObject; var Key: Char); 이벤트핸들러프록시에대한선언부분이다. protected { Protected declarations } procedure InitializeControl; override; procedure EventSinkChanged(const EventSink: IUnknown); override; procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override; ( 중략 ) 앞의세가지메소드는 TActiveXControl 에선언된가상메소드를오버라이드한것으로, 다 음에자세히설명한다.

function Get_AutoSelect: WordBool; safecall; function Get_AutoSize: WordBool; safecall; function Get_BevelInner: TxBevelCut; safecall; ( 중략 ) // 이들은프로퍼티의 getter 메소드로, 이들은 IEditX 인터페이스에정의되어있다. 이들은모두 safecall 호출규칙 (calling convention) 을사용하는데, 이것은오브젝트파스칼에서자동화메소드에호환되는듀얼인터페이스를선언할때사용하는것으로, 예외가발생하면 OLE 호출규칙에의거하여 OLE 에러값을반환한다. procedure Set_AutoSelect(Value: WordBool); safecall; procedure Set_AutoSize(Value: WordBool); safecall; procedure Set_BevelInner(Value: TxBevelCut); safecall; ( 중략 ) // 이들은프로퍼티의 setter 메소드이다. 이들역시 IEditX 인터페이스에정의되어있다. // 참고로 TEditX 컴포넌트에는액티브 X 컨트롤로전환될때사용될수있는 public 메소드가없 는관계로, 메소드에대한선언이빠져있다. implementation uses ComObj; { TEditX } procedure TEditX.InitializeControl; FDelphiControl := Control as TEdit; //Control 은 TActiveXControl 에선언되어있는프로퍼티로, TWinControl 에서상속받은 VCL 컨트롤을지정한다. FDelphiControl 필드에 TEdit VCL 객체의포인터가저장된다.

FDelphiControl.OnChange := ChangeEvent; FDelphiControl.OnClick := ClickEvent; ( 중략 ) // 컨트롤의 VCL 이벤트를컨트롤러객체의이벤트핸들러프록시메소드에매핑하는코드이다. 이렇게함으로써 VCL 컨트롤이이벤트를발생시키면, 컨트롤러객체가이벤트를받게된다. InitializeControl 메소드는컨트롤이생성되고, 컨테이너에삽입되기전에호출되는메소드 로, COM 컨트롤러객체와 VCL 객체간의커넥션을만든다. 보다자세하게설명하면, 컨트 롤러객체가 VCL 객체의포인터를얻은다음, 이벤트프록시를 VCL 객체에연결해준다. procedure TEditX.EventSinkChanged(const EventSink: IUnknown); FEvents := EventSink as IEditXEvents; 컨테이너가제공하는이벤트싱크를저장한다. FEvents 필드는컨테이너객체에이벤트를 발생시킬때사용된다. IEditXEvents 는컨트롤의이벤트 dispinterface 로타입라이브러 리에디폴트소스인터페이스로선언되어있다. procedure TEditX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); 이메소드는개발자가나중에프로퍼티페이지를추가할때사용한다. 프로퍼티페이지를 추가하는방법에대해서는나중에설명한다. 프로퍼티의 Get, Set 메소드의구현방법 VCL 컨트롤의프로퍼티는위저드에의해생성되는컨트롤러객체의 Get, Set 메소드에의 해접근할수있다. 이들이실제로어떻게구현되어있는지살펴보자. 가장전형적인 Get, Set 메소드는다음과같다. function TEditX.Get_AutoSelect: WordBool;

Result := FDelphiControl.AutoSelect; procedure TEditX.Set_AutoSelect(Value: WordBool); FDelphiControl.AutoSelect := Value; 대부분의경우는이와같이간단하게구현이되어있지만, 프로퍼티의데이터형이호환되지않을때에는약간의조작이필요하다. 대부분의경우위저드가자동으로구현해주지만, 지원하지않는데이터형을사용하는 public 프로퍼티는사용할수없게될수도있으며, 이를구현하기위해서약간의코딩이필요할수도있다. 가장복잡한경우가폰트, 그림, string list 등의경우이다. 예를들어폰트의경우독립적인 dispatch 인터페이스를가지는독립적인객체이기때문에, 적절한접근방법이있어야한다. 이를해결하려면 Get_Font 메소드는폰트의프로퍼티를 OLE 프로퍼티로노출 (expose) 시킬수있는 OLE 객체를생성하고, 이를반환해야하며, 반대로 Set_Font 메소드는 OLE 폰트객체의값을 VCL 프로퍼티에대입할수있어야한다. 다행히이를위해, DAX 라이브러리에서는 TFont, TPicture 클래스를위한함수를제공한다. 위저드에서자동으로생성한 Get_Font, Set_Font 메소드는다음과같다. function TEditX.Get_Font: IFontDisp; GetOleFont(FDelphiControl.Font, Result); procedure TEditX._Set_Font(const Value: IFontDisp); SetOleFont(FDelphiControl.Font, Value); 위저드에서일부의프로퍼티는생성하지않는데, 이들의예를들면 Height, Left 등과같이 Extended 프로퍼티를사용해야하는경우나, ParentFont, Hints 등과같이액티브 X 컨테이너가지원할수없는경우, PopUpMenu 와같이 OLE 프로퍼티데이터형이도저히지원할수없는경우등이있다.

이벤트의처리 기본적으로 InitializeObject 메소드에의해 VCL 컨트롤과이벤트핸들러가연결된다는것 은위에서설명했다. 그럼실제이벤트를처리하는부분을살펴보자. procedure TEditX.ChangeEvent(Sender: TObject); if FEvents <> nil then FEvents.OnChange; 이를분석하면, FEvents dispatch 인터페이스가설치되어있으면 ( 즉, IDispatch 포인터가할당되어있으면 ) 단순히이벤트를컨테이너의이벤트싱크에넘겨주는것으로되어있다. FEvents 는위에서설명한 EventSinkChanged 메소드에의해설정된다. KeyPressEvent 는 OnClick, OnChange 이벤트에비해다소복잡하게구현되어있는데, 이는 OLE 이벤트에서요구하는파라미터가델파이이벤트의파라미터와다르기때문에이를변환하는코드가생성되기때문이다. 실제코드를살펴보자. procedure TEditX.KeyPressEvent(Sender: TObject; var Key: Char); var TempKey: Smallint; TempKey := Smallint(Key); if FEvents <> nil then FEvents.OnKeyPress(TempKey); Key := Char(TempKey); 이경우이벤트핸들러프록시는이벤트를컨테이너에발생시키기전에파라미터를조작하게된다. OnKeyPress 이벤트는 SmallInt 에대한포인터를컨테이너에넘기지만, VCL 컨트롤은 Char 에대한포인터를이벤트핸들러에게넘기므로이를 SmallInt 와 Char 로타입캐스팅하는부분이필요한것이다. 참고로, TDateTimePicker 와같이다소복잡한컨트롤의경우에는더복잡한처리방법을가지는경우도있다. 이때에는 VCL 컨트롤에서사용하는 TDateTime, String, Boolean 데이터 type 을 OLE 이벤트의 WideString, WordBool 등으로타입캐스팅할필요가있다. 이런부분을모두위저드가자동으로코딩해준다.

클래스팩토리를통한인스턴스의생성 마지막으로라이브러리가메모리상에로드되었을때, 클래스팩토리를생성하는부분을살 펴보자. initialization TActiveXControlFactory.Create(ComServer, TEditX, TEdit, Class_EditX, 1, '', 0, tmapartment); ComServer 는라이브러리를나타내는전역변수로라이브러리에의해생성된클래스팩토리의리스트를포함하고있다. 2, 3 번째파라미터는각각액티브 X 를구현하는클래스, VCL 컨트롤클래스이며, Class_EditX 는 EditXControl1_TLB.pas unit 에선언되어있는객체의 ClassID 이다. 5, 6, 7 번째파라미터는각각 ToolBarBitmapID, LicenseString, MiscControl flag 등을나타내며, 마지막파라미터에는쓰레딩모델을지정한다. 타입라이브러리 일단액티브 X 라이브러리를컴파일하면타입라이브러리는 DLL 에리소스로복사된다. 액티브 X 컨트롤위저드는처음액티브 X 컨트롤을델파이 VCL 에서생성할때타입라이브러리를만들며이를.TLB 파일로저장한다. 이때위저드는프로퍼티와파라미터를 OLE 에호환되는타입으로전환한다. 컨트롤에나열형프로퍼티나파라미터가포함되어있으면이에대한타입선언부를만들어주며, 데이터타입이 TFont, TPicture, TStrings 일경우에는프로퍼티, 파라미터를 IFont, IPicture, IStrings 로대입하고, 이들에대한어댑터 (adapter) 코드를생성해준다. 만약 VCL 컨트롤에 COM 객체타입이될수없는프로퍼티나파라미터가있을경우에는위저드는이들을생략해버린다. 사용자정의객체스트리밍 DAX 객체에대한기본적인스트리밍 (streaming) 은 VCL 의포맷을따르게된다. 그러나, 개발자가기본적인정보외에추가적인정보를지속적스트림 (persistence stream) 에저장하려한다면 LoadFromStream, SaveToStream 메소드를오버라이딩하면된다. 이때컨트롤의프로퍼티를제대로읽고, 저장하려면 inherited 메소드를호출해야한다. 이들메소드는다음과같이정의되어있다. procedure LoadFromStream(const Stream: IStream);

procedure SaveToStream(const Stream: IStream) 델파이의표준스트리밍클래스는 TStream 이다. 이클래스에는 Read, Write, Seek 메소드가있으며, TPersistent 객체에서 TStream 을이용해스트리밍을하게된다. 대부분의델파이객체가 TPersistent 객체에서상속받으므로, 객체의내용을저장할때 TStream 을사용한다. OLE 에서는스트리밍객체는 IStream 이라는인터페이스를제공하며, 여기에역시 Read, Write, Seek 메소드가정의되어있다. 델파이 4 에서는 TOleStream 이라는클래스를제공하는데이를통해 TStream 을 IStream 으로노출 (expose) 시킬수있다. TActiveXControl 이 SaveToStream 메소드를이용해서객체의상태를스트림에저장할때파라미터로 IStream 을가지는것이다. 만약개발자가추가데이터를스트림에저장하고자한다면스트림어댑터를이용해 TPersistent 객체가그내용을 IStream 에저장하게된다. 다음코드는 TOleStream 을이용해추가적인정보를문자열리스트 (string list) 에담아서저장하는예이다. 또한, InitializeControl 메소드에서 ExtraInfo 문자열리스트객체를생성하고, destructor 인 Destroy 메소드를오버라이드하여사용한 ExtraInfo 문자열객체를해제재주어야한다.... ( 전략 ) protected procedure InitializeControl; override; procedure EventSinkChanged(const EventSink: IUnknown); override; procedure LoadFromStream(const Stream: IStream); override; // 추가 procedure SaveToStream(const Stream: IStream); override; // 추가... ( 중략 ) var ExtraInfo: TStringList; procedure TEditX.InitializeControl;... ExtraInfo := TStringList.Create; destructor TEditX.Destroy;

ExtraInfo.Free; procedure TEditX.SaveToStream(const Stream: IStream); var TempStream: TStream; inherited; TempStream := TOleStream.Create(Stream); try ExtraInfo.SaveToStream(TempStream); finally TempStream.Free; procedure TEditX.LoadFromStream(const Stream: IStream); var TempStream: TStream; inherited; TempStream := TOleStream.Create(Stream); try ExtraInfo.LoadFromStream(TempStream); finally TempStream.Free; 컨트롤에 verb 추가하기 Verb 는사용자가발생시키는액션을말한다. 예를들어, 메뉴아이템에서 copy, paste, run 등을선택하면객체가특정한동작을한다면이들이좋은 verb 의예가된다. 그럼이러한 verb 를우리가제작하는컨트롤에추가시키는방법을배워보자. Verb 를컨트롤에추가할때필요한것은 verb 를등록하는코드와 verb 를실행하는코드

이다. Verb 를등록하는것은객체의클래스팩토리를이용해서라이브러리가인스톨될때 verb information 을시스템레지스트리에복사하는것을말한다. 이런작업은팩토리객체의 AddVerb 메소드를이용하면된다. 다음의코드를살펴보자. const VERB_TEXT = 100; initialization with TActiveXControlFactory.Create(ComServer, TEditX, TEdit, Class_EditX, 1, '', 0, tmapartment) do AddVerb(VERB_CLICK, '&Text ); end. 이코드에의해서 Text 라는 verb 가컨트롤에추가되며사용자가컨테이너의메뉴아이템에서 Text 를선택하면에디트컨트롤의 Text 프로퍼티를변경하도록설정하도록하자. 컨테이너는객체에 verb 가있을때이를나타낼책임을가지고있으며, 사용자가이를선택했을때액티브 X 컨트롤을호출하여야한다. DAX 에서는실제로 verb 를실행할때 PerformVerb 메소드를호출한다. 앞의 Text verb 에대응하기위한 PerformVerb 메소드는다음과같은식으로작성하면된다. 먼저 interface 의 protected 섹션에메소드를선언하고, 이를구현한다. InputBox 함수는 Dialogs.pas 유닛에선언되어있으므로 uses 절에 Dialogs.pas 유닛을추가할필요가있다. procedure PerformVerb(Verb: Integer); override; procedure TEditX.PerformVerb(Verb: Integer); var InputText: string; case Verb of VERB_TEXT: InputText := InputBox(' 텍스트 ', ' 문자열을입력하세요!', '');

FDelphiControl.Text := InputText; else Inherited PerformVerb(Verb); 프로퍼티페이지의제작 프로퍼티페이지는사용자에게컨트롤의프로퍼티를편집할수있게하기위해제공되는폼이다. 프로퍼티페이지를반드시제공할필요는없는데, 이때에는각개발툴의프로퍼티인스펙터에서프로퍼티를변경하게된다. 그러나, 프로퍼티를제공하면사용자가보다쉽고직관적인인터페이스를가지고프로퍼티를편집할수있게된다. 프로퍼티페이지역시 OLE 객체로액티브 X 라이브러리에포장되고시스템레지스트리에등록되어야한다. 그러나, 이를사용하는컨트롤과같은라이브러리에포함되어야하는것은아니기때문에다른컨트롤에서등록된같은프로퍼티페이지를사용하는것도가능하다. 델파이에서는폰트와컬러, 그림과문자열에대한 4 가지의기본적인프로퍼티페이지를제공한다. 이들의클래스 ID 는각각 Class_DColorPropPage, Class_DFontPropPage, Class_DPicturePropPage, Class_DStringPropPage 이다. 프로퍼티페이지를추가하려면객체저장소나 File New.. 메뉴의액티브 X 페이지에서액티브 X 프로퍼티페이지위저드를실행하면된다. 위저드를실행하면폼하나와 unit 파일하나가자동으로생성되는데, 다음그림은 TEdit 의 Enabled 프로퍼티를체크하는체크박스를프로퍼티페이지에올려놓은그림이며, 생성되는코드는다음과같다. unit EditXProp;... ( 중략 ) type TPropertyPage1 = class(tpropertypage) CheckBox1: TCheckBox;

private protected public procedure UpdatePropertyPage; override; procedure UpdateObject; override; 여기에서프로퍼티페이지클래스는 TPropertyPage 클래스에서상속받음을알수있으며, 폼에삽입한 CheckBox 컨트롤이있다. TPropertyPage 클래스는 TCustomForm 클래스에서상속받은것으로 OleObject 프로퍼티를이용해프로퍼티페이지와객체의편집을연결하며, UpdatePropertyPage, UpdateObject 메소드를제공하는데, 이를오버라이드하여실제로 OLE 객체를편집하게된다. 이들메소드를다음과같이구현하였다. procedure TPropertyPage1.UpdatePropertyPage; CheckBox1.Checked := OleObject.Enabled; // 이부분을실제로추가해주어야함 procedure TPropertyPage1.UpdateObject; OleObject.Enabled := CheckBox1.Checked; // 이부분을실제로추가해주어야함 UpdatePropertyPage 메소드는 OLE 객체의프로퍼티를프로퍼티페이지에반영하는역할 을하며, UpdateObject 메소드는프로퍼티페이지의내용을 OLE 객체에반영한다. initialization TActiveXPropertyPageFactory.Create(ComServer, TPropertyPage1, Class_PropertyPage1); end. 이코드는프로퍼티를 COM 객체로등록하는것으로, TActiveXPropertyPageFactory 의메소드를사용하게된다. ComServer 는액티브 X 라이브러리를대표하는전역변수이며, TpropertyPage1 은폼의클래스, Class_PropertyPage1 은프로퍼티페이지객체의클래스 ID 이다. 이렇게제작한프로퍼티를실제로액티브 X 컨트롤에적용하려면 DefinePropertyPages 메소드를변경하면되는데, 처음만들어진코드에는이부분이주석으로채워져있다. 이를다음과같은코드로바꾸어주면된다.

procedure TdateTimePickerX.DefinePropertyPages(DefinePropertyPage: TdefinePropertyPage); DefinePropertyPage(Class_PropertyPage1); // 추가된부분 여기에여러개의프로퍼티페이지를 DefineProperyPage 메소드를이용해서컨트롤이여 러개의등록된프로퍼티페이지를이용하도록할수있다. Ambient 프로퍼티의이용 Ambient 프로퍼티는컨트롤의컨테이너에의해제공되는프로퍼티를말한다. 일단컨트롤이컨테이너에삽입되면, 컨테이너의 ambient 프로퍼티의정보를물어보게된다. 그러므로, 컨테이너는노출시키려는 ambient 프로퍼티를정의하고있어야한다. 액티브 X 는 BackColor, DisplayName 등의표준 ambient 프로퍼티를정의하고있다. 물론이들을모두컨테이너가노출할필요는없지만, 마이크로소프트는이들을사용하기위해각각에대한 dispid 를정의하고있다. 그러므로, 액티브 X 에서 ambient 프로퍼티에접근할때에는사이트의 IDispatch 인터페이스를사용한다. 델파이에서는 IAmbientDispatch 인터페이스를제공하는데, 이인터페이스를이용하여표준인터페이스에접근이가능하다. IAmbientDispatch 인터페이스는어디까지나 dispinterface 이므로단지 IDispatch 의포인터일뿐이며, 다른 dispinterface 로형변환이가능하다. IAmbientDispatch 인터페이스의선언부는다음과같다. IAmbientDispatch = dispinterface ['{00020400-0000-0000-C000-000000000046}'] property BackColor: Integer dispid DISPID_AMBIENT_BACKCOLOR; property DisplayName: WideString dispid DISPID_AMBIENT_DISPLAYNAME; property Font: IFontDisp dispid DISPID_AMBIENT_FONT; property ForeColor: Integer dispid DISPID_AMBIENT_FORECOLOR; property LocaleID: Integer dispid DISPID_AMBIENT_LOCALEID; property MessageReflect: WordBool dispid DISPID_AMBIENT_MESSAGEREFLECT; property ScaleUnits: WideString dispid DISPID_AMBIENT_SCALEUNITS; property TextAlign: Smallint dispid DISPID_AMBIENT_TEXTALIGN; property UserMode: WordBool dispid DISPID_AMBIENT_USERMODE; property UIDead: WordBool dispid DISPID_AMBIENT_UIDEAD; property ShowGrabHandles: WordBool dispid DISPID_AMBIENT_SHOWGRABHANDLES;

property ShowHatching: WordBool dispid DISPID_AMBIENT_SHOWHATCHING; property DisplayAsDefault: WordBool dispid DISPID_AMBIENT_DISPLAYASDEFAULT; property SupportsMnemonics: WordBool dispid DISPID_AMBIENT_SUPPORTSMNEMONICS; property AutoClip: WordBool dispid DISPID_AMBIENT_AUTOCLIP; 다음의코드는 TEditX 컨트롤을클릭할때컨테이너에서의컨트롤의이름을메시지박스로 나타내도록한것이다. 이를위해 DisplayName ambient 프로퍼티를이용하였다. procedure TEditX.ClickEvent(Sender: TObject); var Site: IOleClientSite; Ambients: IDispatch; GetClientSite(Site); if Site <> nil then Site.QueryInterface(IDispatch, Ambients); if Ambients <> nil then ShowMessage(IAmbientDispatch(Ambients).DisplayName); if FEvents <> nil then FEvents.OnClick; 이렇게하면, 앞으로는에디트박스를클릭할때마다폼에서의에디트박스의 Name 프로퍼티의내용이메시지박스로뜰것이다. Ambient 프로퍼티를가장유용하게사용되는경우는컨테이너의색상변화에따라컨트롤의색상변화를유도하고싶다거나, 글꼴변화에따른컨트롤의변화와같이사용자인터페이스측면에서반드시사용해야할경우들이있다. 이럴때에는 ambient 프로퍼티의이용이유일한해결책이될수있다. 이를위해서컨테이너가 ambient 프로퍼티의값을변경했을때, 이를알아챌수있어야하는데이때에는컨테이너객체의 OnAmbientPropertyChange 메소드를호출하게된다. 그러므로델파이에서이를이용하려면 OnAmbientPropertyChange 메소드를오버라이드하고, IOleControl 인터페이스를다시구현하면된다.

사용자정의레지스트리엔트리의추가 액티브 X 컨트롤을작성한뒤에는레지스트리에컨트롤에대한정보를추가하고싶을경우가있다. 보통액티브 X 컨트롤이등록될때이런작업이병행된다면좋을텐데, 이를해결하는방법이없는지궁금하지않은가? 이를위해서는델파이 COM 팩토리의 UpdateRegistry 메소드를이용하면된다. 이메소드는라이브러리가등록되거나해제될때호출되기때문에여기에다가레지스트리에각종정보를추가하는코드를삽입하면된다. 그러므로, UpdateRegistry 메소드를오버라이드해야하므로 TActiveXControlFactory 클래스를상속받은새로운클래스팩토리클래스를정의하고, 이클래스팩토리를이용하여액티브 X 라이브러리를등록하도록수정해야한다. 다음의클래스는클래스팩토리의 constructor 에레지스트리에등록할문자열을미리파라미터로받아서이를레지스트리에등록하도록수정한클래스팩토리클래스를구현한것이다. type TRegistryFactory = class(tactivexcontrolfactory) public constructor Create(ComServer: TComServerObject; ActiveXControlClass: TActiveXControlClass; WinControlClass: TWinControlClass; const ClassID: TGUID; ToolboxBitmapID: Integer; const LicStr: string; MiscStatus: Integer; ThreadingModel: TThreadingModel = tmsingle; SpecialKeyValue: string); override; procedure UpdateRegistry(Register: Boolean); override; protected FSpecialKeyValue: string; constructor TRegistryFactory.Create(ComServer: TComServerObject; ActiveXControlClass: TActiveXControlClass; WinControlClass: TWinControlClass; const ClassID: TGUID; ToolboxBitmapID: Integer; const LicStr: string; MiscStatus: Integer; ThreadingModel: TThreadingModel = tmsingle; SpecialKeyValue: string); var TypeAttr: PTypeAttr; FSpecialKeyValue := SpecialKeyValue; inherited Create(ComServer, ActiveXControlClass, WinControlClass, ClassID, ToolboxBitmapID, LicStr, MiscStatus, ThreadingModel);

procedure TRegistryFactory.UpdateRegistry(Register: Boolean); var ClassKey: string; ClassKey := 'CLSID\' + GUIDToString(ClassID); if Register then inherited UpdateRegistry(Register); CreateRegKey(ClassKey + '\SpecialKey', '', FSpecialKeyValue); end else DeleteRegKey(ClassKey + '\SpecialKey'); inherited UpdateRegistry(Register); 이클래스팩토리를이용하기위해서는액티브 X 라이브러리의 initialization 섹션을다음과 같이수정하면된다. 다음의경우추가적인레지스트리키값을 Sample 로설정하는경우 이다. initialization TRegistryFactory.Create(ComServer, TEditX, TEdit, Class_EditX, 1, '', 0, tmapartment, Sample ); end. 액티브 X 컨트롤의등록과이용 그러면, 이렇게작성한액티브 X 컨트롤을등록하고이용하는방법에대해서알아보자. 여기에서설명하는내용은인터넷에서쉽게구할수있는여러가지다른액티브 X 컨트롤에대해서도공통적으로적용된다고할수있다. 델파이에서액티브 X 컨트롤을이용하려면먼저.ocx 파일을레지스트리에등록시켜야한다. 델파이를이용해서작성한경우에는컴파일하고, 간단히 Run Register ActiveX Server 메뉴를이용하여등록이가능하지만, 인터넷에서구한경우에는 RegSvr.EXE 와같은등록프로그램을이용하거나.REG 파일을작성하여등록해야한다.

EditX 컨트롤은간단히컴파일하고 Run Register ActiveX Server 메뉴를선택하여레지스트리에등록할수있다. 이렇게등록한액티브 X 컨트롤을이용하려면델파이의컴포넌트팔레트에추가해야한다. 이를위해서는 Component Import ActiveX Control 메뉴를선택하거나, Component Install Packages 메뉴를선택하여패키지를먼저선택한뒤에 Edit 버튼을클릭하고액티브 X 컨트롤을추가할수있다. 이대화상자에서팔레트페이지의이름과생성될 _TLB.pas 파일의위치를지정할수있다. Search Path 에디트박스에는액티브 X 서버파일의위치를검색할디폴트패스를나열하게된다. 추가가가능하며, 여기서지정한패스가아닌곳에위치한액티브 X 서버는이대화상자에나타나지않는다. 이런경우에는 Add 버튼을클릭하여액티브 X 서버파일의위치를지정할수있다. Install.. 버튼을클릭하면설치할패키지를지정하라는대화상자가나타날것이다. 여기에서적절한패키지파일을선택하거나, 새로운패키지를지정하여설치할수있다. 이렇게하면, 다음과같은패키지관리자가나타나면서설치가될것이다.

변경사항이있는경우에는 Compile 버튼을누르면컴포넌트팔레트에변경된내용이즉시반영된다. 여기에서더추가하거나제거하고싶은컴포넌트나액티브 X 컨트롤이있으면 Add 버튼을클릭하여추가나제거가가능하다. 이제새로운어플리케이션을시작하고, EditX 컨트롤을사용해보자. 컴포넌트팔레트의 ActiveX 탭에서 EditX 컨트롤을폼에올려놓도록하자. 아마도 TEdit 컴포넌트를올려놓는것과거의같다는것을느낄수있다. 사용법역시동일하다. TEditX 컨트롤위에서오른쪽버튼을클릭하여팝업메뉴를띄워보자. 아마도기본적인 Properties 메뉴와추가한 Verb 메뉴인 Text 메뉴가 Verb 메뉴로다음과같이나타날것이다. 여기서 Properties 메뉴를선택하여우리가추가한프로퍼티페이지가다음과같이나타날 것이다.

여기서체크박스의내용을이용하여 Enabled 프로퍼티를조절할수있다. 그러면, 이번에는 Text verb 를실행해보도록하자. 그러면, 우리가코딩한대로다음과같은입력박스가나타날것이다. 여기에서아무값이나입력하면에디트컨트롤의내용인입력한값으로변경될것이다. 나머지사용방법은 TEdit 컴포넌트와거의유사하게사용할수있다. 다른액티브 X 컨트 롤도이와비슷한방법으로쉽게사용할수있다. 액티브폼 (ActiveForm) 의제작 액티브폼은 VCL 폼에기반을둔액티브 X 컨트롤이라고생각하면된다. 그러니까, 일종의액티브 X 컨트롤인셈이다. 그렇지만, 델파이 3 에서발표된액티브폼은인트라넷개발환경을지원하기위해서여러모로활용되면서나름대로독자적인입지를굳힌듯하다. 비록인터넷에서범용액티브 X 컨트롤로사용하기에는다소무리가따르지만일정정도의네트워크속도가보장되는인트라넷환경에서는델파이에서일반적으로개발하는폼에기반한개발방법을그대로적용해서하나의컨트롤로만들어낼수있다는것은나름대로의매력이있다고생각할수있다. 액티브폼은델파이에서제공하는액티브폼위저드를이용하여작성한다. 먼저 File New

메뉴의 ActiveX 탭에서 ActiveX Library 아이콘을더블클릭한다. 액티브폼역시액티브 X 컨트롤이기때문에.ocx 파일형태의 in-process 액티브 X 라이브러리로등록되어사용된다. 이렇게하면, 델파이에서비어있는프로젝트가하나생성될것이다. 그다음에는폼을생성할차례이다. 마찬가지로 File New 메뉴의 ActiveX 탭에서이번에는 ActiveForm 아이콘을더블클릭하면액티브 X 컨트롤위저드를생성할때와거의동일한대화상자가나타날것이다. 여기에서적당한이름과모델들을선택하고 OK 버튼을클릭하면, 흔히보는비어있는폼이하나만들어질것이다. 여기까지별로한것이없어보이지만, 델파이가내부적으로많은코딩을해놓은상태이다. 개발자가할일은이폼을이용해서마음대로사용자인터페이스를디자인하고필요한코딩을해주면된다. 개발하는방법은일반적인폼을이용해서개발하는것과완전히동일하다. 컴포넌트를올려놓고, 거기에대한이벤트핸들러를작성한다. 단지다른점이있다면, 컴파일을하고나서이폼을실제로실행할수있는것은 HTML 페이지위에서만할수있다는것이다. 다음에설명하는웹배포방법을이용해서액티브폼을 HTML 파일로변경하고, 이파일을열어보면액티브폼이제대로실행되는지알아볼수있다. 그러면만들어진빈폼에다음과같이버튼을하나올려놓고 Caption 프로퍼티를 OK! 로설정하고, OnClick 이벤트핸들러를다음과같이작성한다. procedure TActiveFormX.Button1Click(Sender: TObject); ShowMessage(' 연습입니다!'); 그리고, 컴파일을하면프로젝트파일에대한.ocx 파일이생성될것이다. 웹을이용해배포할수있도록옵션을지정하고, 실제로배포를하면완료된다. 앞으로할일은 웹배포 (Web Deployment) 델파이로제작한액티브 X 컨트롤을웹사이트에배포할때에는다음과같은몇가지를지정해주어야한다. 웹배포의옵션은 Project Web Deployment Options 메뉴를선택하면설정할수있다. 이메뉴를선택하면웹배포옵션을위한대화상자가나타나는데, 여기에서가장중요한부분은다음에설명하는 Target dir, Target URL, HTML dir 에대한내용이다.

1. Target dir: 델파이가복사할코드베이스파일이위치할디렉토리를지정한다. 2. Target URL: 바이너리코드베이스가존재하는서버를지정한다. 이는 URL 의형태인데예를들어 http://www.sample.com/code/sample.ocx 등과같은형태를가진다. 3. HTML dir: 델파이가복사할 HTML 파일이위치할디렉토리를지정한다. HTTP 서버가로컬머신에있다면 c:\https\codebase\ 과같은패스이름이된다. 일단이들옵션을지정하면, Project Web Deploy 메뉴를선택하여코드를서버로복사할수있다. Web Deploy 를선택하면델파이는컨트롤이포함될웹페이지를 HTML 디렉토리에복사하고, 컨트롤을코드베이스디렉토리에복사한다. 그러면앞에서간단하게만들어본액티브폼.ocx 파일을배포해보도록하자. Project Web Deployment Options 메뉴를선택하고, 대화상자의내용을다음과같이설정한다. 물론여기에서보여준디렉토리정보는개발자의컴퓨터의.ocx 파일의위치에해당되는것이므로모두들다를것이다. 아마도제공되는 CD-ROM 의 HTML 파일의내용도이렇게설정되어있으므로액티브폼의디렉토리가 C:\Book\Chap29 가아니면액티브폼의내용을 IE 로볼수없을것이다. 그럴때에는 HTML 파일을열어서자신의디렉토리에맞게변경하기만하면된다. 여기서 URL 을 c:/book/chap29 로설정하였는데, 물론앞에서간단히설명했듯이웹서버

의위치를알면웹서버의 URL 이름을이용하여디렉토리까지만설정하면된다. 여기서는개발자가일단웹서버가없어도컨트롤을쉽게보고디버깅할수있도록개발자의컴퓨터의물리적인디렉토리를그대로지정하였다. 여기서주의할것은 URL 명명규칙상 \ 가아닌 / 을사용한다는것이다. 그리고, 만약에서버가리모트웹서버이면, 로컬컴퓨터에 HTML 파일과코드베이스파일을저장하도록지정한후, FTP 를이용해서웹페이지에배포해야한다. OK 버튼을클릭하고, Project Web Deploy 메뉴를선택하면지정된디렉토리에.htm 파일이생성될것이다. 필자의 HTML 파일의코드는다음과같다. <HTML> <H1> Delphi 4 ActiveX Test Page </H1><p> You should see your Delphi 4 forms or controls embedded in the form below. <center><p> <OBJECT classid="clsid:761b37b2-31e6-11d2-9774-0000e838052e" codebase="c:/book/chap29/activeformproj1.ocx"#version=1,0,0,0 width=372 height=200 align=center hspace=0 vspace=0 > </OBJECT> </HTML> 물론, HTML 태그를이용하여 <OBJECT>, </OBJECT> 사이의 width, height 등의내용을변경하여폼의크기도변경할수있고, 그밖의다른내용도에디터를이용하여쉽게변경이가능하다. 그러면, IE 를띄우고만들어진 HTML 파일을더블클릭하여실제액티브폼을띄워보자. 이때다음에설명할코드사인을하지않은.ocx 파일이포함되지않은액티브폼이므로 IE 의보기 인터넷옵션메뉴를선택하고보안레벨을 낮음 으로선택해야액티브폼을볼수있다. 보안레벨을 보통 이상으로설정한경우에는코드사인이된액티브 X 컨트롤만볼수있다.

코드사인 (Code Signing) 코드사인의가장중요한요소는인증을부여할수있는업체에게서코드키 (code key) 를부여받는것이다. 마이크로소프트에서는테스트의목적으로키를생성할수있는방법을제공하고있다. 마이크로소프트의웹사이트에가면이에대한정보를얻을수있으며, Authenticode 2.0 에대한글을읽어보면도움이될것이다. 델파이 4 는프로젝트옵션페이지에서 code signature 정보를지정할수있다. Project Web Deployment Options 대화상자의 Project 페이지에서 Code Sign Project checkbox 를체크하고, Code Signing page 에서배포할라이센스파일의이름과 private key 를지정하면끝난다. Application name, optional company URL 필드는컨트롤이다운로드될때이곳에회사의정보를적어넣으면된다. 또한, 암호화알고리즘을선택할수있는데디폴트로는가장흔히사용되는 MD5 가선택되어있을것이다. MD5 는 RSA Data Security 에의해개발된해슁알고리즘으로 128 비트해쉬 (hash) 값을만들어낸다. 다른것으로 SHA 1 을선택할수있는데, 이것은 NIST(National Institute of Standards and Technology) 와 NSA(National Security Agency) 에의해개발된해슁알고리즘으로 160 비트해쉬값을만들어낸다.

웹보안 (Web Security) 액티브 X 컨트롤은강력하고편리하지만사용자에게심각한위험을초래할수도있다. 액티 브 X 컨트롤을만드는사람이면꼭고려해야할사항이있어서여기에몇가지원칙을나열 하였다. 1. 당연한말이지만해로운액티브 X 컨트롤을만들면안된다. 2. 만들어진컨트롤이함부로변형될수있으면안된다. 3. 아무나함부로사용할수있도록해서는안된다. 가능하면인증을받고패스워드에신 경을쓰도록한다. 4. 가능하면어떤사람이, 어디서컨트롤을다운로드받았는지파악할수있도록서버를 설정한다. 액티브 X 컨트롤은인터넷보다는사실인트라넷환경에적절하다고할수있다. 인트라넷 에액티브 X 컨트롤을배포하는사람은다음과같은사항에신경을쓰는것이좋다. 1. Code signature 는완벽한보안이되지못한다. 그러므로과신은금물이다. 2. 아주믿을만하지못한사람이만든 HTML 파일에포함된액티브 X 컨트롤을받아들이 지않는것이좋다. 추가적인배포옵션 그밖에도웹배포를할때지정할수있는옵션들이많은데, 여기에대해서조금더알아보도록하자. CAB 파일을설정하면윈도우 95 에서사용되던캐비넷이라는압축파일로파일라이브러리를관리할수있도록할수있다. 캐비넷압축은다운로드속도를많이줄여주므로, 인터넷환경에서는매우유용하게사용될수있다. 설치도중에브라우저가캐비넷에저장된파일의압축을해제해서저장하므로, 수행성능의저하나비효율성은거의없다고생각해도된다. 보통액티브 X 컨트롤이나액티브폼을델파이에서개발하여배포할때에는처음에런타임패키지를배포하고, 작아진컨트롤을업그레이드로배포하는것이효율적이다. 이렇게하기위해서처음에패키지에대한옵션을설정할수있다. 참고로, 델파이에의해제공되는모든패키지는기본적으로볼랜드에서코드사인한것이므로쉽게 CAB 파일로통합해서배포할수있다. 이렇게액티브 X 컨트롤을배포할때패키지나다른추가적인파일과함께배포되어야한다면,.INF 파일이자동으로생성된다. 이파일은다운로드할파일과액티브 X 라이브러리를

설정하는방법등에대한내용을지정하게된다. 옵션의조합 다음테이블은패키지와 CAB 파일압축, 코드사인에대한정보를옵션의체크박스에서 선택할때의결과에대해서정리한것이다. 패키지 / 추가파일 CAB 압축코드사인결과 X X X.OCX 파일단독 X X O.OCX 파일단독 X O X.OCX 파일을포함한 CAB 파일 X O O.OCX 파일을포함한 CAB 파일 O X X.INF 파일과.OCX 파일그리고추가적인파일과패키지 O X O.INF 파일과.OCX 파일그리고추가적인파일과패키지 O O X O O O.INF 파일,.OCX 파일을포함한.CAB 파일, 그리고추가적인파일과패키지를포함한 CAB 파일.INF 파일을포함한 CAB 파일,.OCX 파일을포함한 CAB 파일, 추가적인파일과패키지를포함한 CAB 파일 Packages, Additional Files 탭 웹배포옵션의 Packages, Additional Files 탭에서어떤패키지를배포할것인지지정할수있다. 특정패키지의설정을변경하려면 Packages used by project 리스트박스에나열된패키지중에서변경할패키지를선택하면된다. 기본적으로이들탭의옵션내용은동일하다. CAB 옵션에서 Compress in a separate CAB 옵션은각패키지별로분리된.CAB 파일을생성한다. 이옵션이디폴트로설정되어있다. Compress in a project CAB 옵션은프로젝트.CAB 파일에서의패키지를포함하게하는옵션이다. Output 옵션은패키지가버전정보를가지고있거나코드사인에대한내용을설정하는옵션으로 Use file VersionInfo 옵션은패키지파일의리소스에저장된버전정보를.INF 파일에서사용할수있도록한다. Code sign file 옵션은패키지나.CAB 파일의코드사인을한다. Directory and URL options 옵션에서 Target URL 에디트박스는 URL 형태로서의웹서버의패키지위치를지정한다. 이에디트박스가비어있으면, 목적기계에이미파일이존재하는것으로간주한다. 즉, 패키지가지정된위치에존재하지않으면, 액티브 X 컨트롤

의다운로드가실패한다. Target directory 에디트박스에는웹서버에서패키지의패스를 지정한다. 정리 (Summary) 이번장을마치기전에관심있는독자들을위해델파이와 COM, 액티브 X 컨트롤에대해공부할거리를제시하고자한다. 기본적으로는 TActiveXControl 이지원하는각종인터페이스의정의와설명을마이크로소프트의 SDK 등의자료를이용해서숙지하는것이필요하며, 그밖에앰비언트프로퍼티 ( 컨테이너에서제공되는프로퍼티 ), 커스텀레지스트리엔트리를추가하는법등의정보를알아보는것이좋겠다. 가장좋은공부법은다소어렵더라도 Inprise 에서제공하는뉴스그룹을참조하는것이가장큰도움이될것으로생각되는데, borland.public.delphi.activex.controls.writing 과 borland.public.delphi.oleautomation 의 2 사이트가가장많은정보를가지고있으며, 이를읽다보면좋은사이트가많이소개되어있으니한번씩들러보는것이도움이될것이다.