웹브라우져에 붙이기 위한 ActiveX 프로그래밍 방법

31433 
Created at 2006-09-29 06:45:09 
310   0   0   0  
 
- ActiveX의 등록


들어가며...

얼마전 까지만 해도 ActiveX의 제작이나 사용은 나에겐 먼나라 같은 일이었다.
그런데 그것이 현실로 다가올 줄이야. 흑흑...
ActiveX의 제작까지는 델파이라는 훌륭한 매개체를 이용하여 손쉽게 작성할 수 있었다. 그런데 문제는 바로 이 제작된 ActiveX의 등록에 있었다. 이 ActiveX의 등록 방법에 대해 간단히 알아보자.


AcitveX의 제작...

ActiveX의 제작은 이미 여러번 강좌나 기타 책등에서 많이 다룬 문제이므로 이곳에서는 생략하기로 하고 실제 이렇게 제작된 ActiveX를 어떻게 Web에 보이게 할 것인지 생각해 보자.
제작된 ActiveX는 일단 등록을 해야 한다. 등록은 Regsvr32.exe를 이용해서 하게 되는데 일단 등록까지는 별 문제가 없을 것이다.
이제 테스트용 HTML을 제작해서 ActiveX를 불러 오기만 하면 된다.
이때 한가지 문제가 생긴다. 그냥 단순히 불러오기만 하는 것이라면 커다란 문제가 없다. 그런데 이 ActiveX의 내부 Procedure나 Event를 HTML Code와 Sink 시키려면 AcitveX의 Object ID가 있어야 한다.
애석하게도 델파이에서 생성시켜 주는 테스트용 HTML에서는 결정적으로 이 Object ID를 생성해 주지 않는다. 하다 못해 VB도 생성해 주는 이 Object ID를 델파이에서 생성해 주지 않는다니 가슴이 몹시 아프다. 쩝...

우리가 할 수 있는 방법은 몇가지가 있다. 직접 이 ID를 생성해 주는 것이 첫번째이고, 두번째는 Edit Plus나 다른 툴을 이용하는 것이다.
개발자들은 매우 게으른 사람들이란 얘기를 누군가 했었다. 그 말인 즉 개발자들은 어떤 문제를 손쉽게 해결해 줄 수 있는 도구를 먼저 찾고 없으면 그 도구를 만들어서라도 일을 손쉽게 해결하려는 경향이 있다는 것이다. 맞는 말이다. 본인 또한 이런 일을 해 줄수 있는 도구를 찾았으며 곧 MS에서 무료로 제공하는 두개의 툴을 구할 수 있었다.
'ActiveX control Pad'란 녀석과 'ActiveX Lister'란 녀석들인데 이 툴을 사용하면 AtiveX를 개발 하고 나서 웹에 올리는데 드는 수고를 1/3로 줄여준다.

간단히 소개를 하자면...

'ActiveX Lister'란 녀석은 기존에 시스템에 등록되어있는 모든 ActiveX 컨트롤들은 일목 요연하게 표시하여 준다. 그중 하나를 선택하고 복사를 하면 Clipboard에 복사를 해 주는데... HTML로 붙이기를 해 보면 그  편리함에 새삼 놀라게 된다.

예로... 'Microsoft Forms 2.0 Image'라는 AcitveX를 선택하고 복사한 후 HTML에서 붙이기를 하면...

<Object
  Id="Microsoft Forms 2.0 Image"
  Classid="clsid:4c599241-6926-101B-9992-00000B65C6F9"
  Width=80
  Height=30
</Object>

라고 만들어 준다. 간편하지 않은가? ^^
우리가 원했던 Object ID까지 모두 생성해서 하나의 HTML 코드로 만들어 준다. 생활에 편리함을 주는 도구이다.

또다른 툴인 'ActiveX Control Pad'란 녀석은 그 기능에 몹시 놀라게 된다.
Lister란 녀석은 간단히 Object를 생성하는 코드만을 만들어 주는데 반해 이 제어패드는 Object를 생성코드는 물론 ActiveX에 정의된 모든 Procedure와 Event를 보여주며 손쉽게 이 procedure와 Event를 HTML에 붙일 수 있도록 VBScript 코드를 자동으로 생성해 준다. 또 JAVAScript 코드로도 만들어 준단다...
이 얼마나 고마운 녀석인가... 흑...

이 고마운 녀석들은 www.microsoft.com/intdev/sdk 에서 모두 구할 수 있다.
참고하자...

이렇게 함으로써 Object ID를 생성하는 부분은 해결이 되었고...
또다른 문제 하나... 바로 보안 경고 메시지가 뜬다는 것이다.

"이 페이지의 ActiveX는 잠재적 위험성이 있습니다. 초기화 및 스크립트 액세스를 허용하시겠습니까?"

라고 물어보는 Dialog 창이 매번 실행 할 때 마다 뜬다. 이 메시지는 IE의 옵션 조작으로도 안 보이게 할 방법이 없다.

이것은 이 ActiveX 안전하다는 것을 보장하는 코드가 빠져있기 때문에 나타나는 메시지인데. VC++에서는 *.RGS라는 파일을 만들어주며 이 파일의 내용은 registry에 Safe Key를 추가하는 역할을 하는 코드가 들어있다.
이 Safe Key를 Registry에 추가해야만 이 메시지를 피할 수 있는데 이 또한 애석하게도 델파이에서는 생략되어 있다.

이것을 가능하게 해주는 'Safefactory.pas'란 파일의 풀 소스를 아래에 첨부한다.

- safefactory.pas -

unit SafeFactory;
interface
uses ComObj, ActiveX, AXCtrls;

const
CATID_SafeForScripting: TGUID =
'{7DD95801-9882-11CF-9FA9-00AA006C42C4}';
CATID_SafeForInitializing: TGUID =
'{7DD95802-9882-11CF-9FA9-00AA006C42C4}';

type
TSafeActiveFormFactory = class( TActiveFormFactory )
  procedure UpdateRegistry( Register: Boolean ); override;
end;

TSafeActiveXControlFactory = class( TActiveXControlFactory )
  procedure UpdateRegistry( Register: Boolean ); override;
end;

implementation

procedure AddSafetyKeys( const ClassID: TGUID );
var
ClassKey: string;
begin  
ClassKey := 'CLSID' + GUIDToString( ClassID );
CreateRegKey( ClassKey + 'Implemented Categories','','');
CreateRegKey( ClassKey + 'Implemented Categories'+GUIDToString(
CATID_SafeForScripting ),'','');
CreateRegKey( ClassKey + 'Implemented Categories'+GUIDToString(
CATID_SafeForInitializing ),'','');
end;

procedure RemoveSafetyKeys( const ClassID: TGUID );
var
ClassKey: string;
begin      
ClassKey := 'CLSID' + GUIDToString( ClassID );
DeleteRegKey( ClassKey + 'Implemented Categories'+GUIDToString(
CATID_SafeForInitializing ));
DeleteRegKey( ClassKey + 'Implemented Categories'+GUIDToString(
CATID_SafeForScripting ));
DeleteRegKey( ClassKey + 'Implemented Categories');
end;

{TSafeActiveFormFactory}
procedure TSafeActiveFormFactory.UpdateRegistry( Register: Boolean ); begin
if Register then
begin
  AddSafetyKeys( ClassID );
  inherited UpdateRegistry( Register );
end
else
begin
  RemoveSafetyKeys( ClassID );
  inherited UpdateRegistry( Register );
end;
end;

{TSafeActiveXControlFactory}
procedure TSafeActiveXControlFactory.UpdateRegistry( Register: Boolean );
begin
if Register then
begin
  AddSafetyKeys( ClassID );
  inherited UpdateRegistry( Register );
end
else
begin
  RemoveSafetyKeys( ClassID );
  inherited UpdateRegistry( Register );
end;
end;

end.

이 부분을 safefactory.pas로 저장하고... 기존에 만들었던 AcitveX의 initialization 부분의 TActiveFormFactory 를 TSafeActiveFormFactory로 고쳐준다.

예 )

initialization
TeActiveFormFactory.Create(
  ComServer,
  TActiveFormControl,
  TMailServer,
  Class_MailServer,
  1,
  '',
  OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL);
end.

이렇게 고친다... ^^

initialization
TSafeActiveFormFactory.Create(
  ComServer,
  TActiveFormControl,
TMailServer,
  Class_MailServer,
  1,
  '',
  OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL);
end.

이렇게 함으로써 우리는 보안 메시지를 안뜨게 할 수 있게 되었다.
이 Safefactory의 역할은 해당 CLSID에 Safe Key를 추가하는 역할을 하며 이 Key는 Registry에 등록되게 된다.

이제 거의 끝나간다... ^^

마지막으로 남은 문제 한가지... 바로 인증 부분이다. 이런 메시지를 본적이 있을 것이다.

"현재 보안 설정으로는 이 페이지의 ActiveX 컨트롤을 실행할 수 없습니다.
그러므로, 이 페이지가 정상적으로 표시되지 않을 수 있습니다."

라는 메시지인데... 이 메시지는 인증키가 없는 ActiveX를 Load할 경우 나타내는 보안 메시지이다. 이 메시지를 안보이게 해결하려면 IE의 보안 수준을 "낮음"으로 설정함으로써 해결 할 수 있는데 모든 사용자에게 그렇게 설정하도록 하는것은 매우 위험한 발상이다.

이것을 또 해결해 보자... 쩝...

VerySign이란 인증 전문 회사를 들어보았을 것이다. 이 VerySign이란 할일없는 회사는 인증키만 내주고 할 일없이 200달러나 받아 챙긴다. 정말 칼만 안들었지 으...

우리같은 영세민이 어찌 간단한 ActiveX 하나때문에 200달러나 낼 수 있겠는가...
그러나 이 인증 제도는 반드시 필요하다. ActiveX는 다른 VBScript나 JAVAScript 또 JAVA Applet과는 달리 시스템을 파괴할 수 있는 코드를 가지고 있을 수 있기 때문이다. 맘먹기 따라 남의 하드를 말끔히 포맷 시키는 것도 가능하다. 그렇기 때문에 안전하다는 인증을 받도록 한 것은 잘한일이다.
그러나 역시 영세한 본인은 이 인증 코드를 직접 만들어야 했다. 테스트를 위해 인증키를 만들 수 있도록 MS에서는 INet SDK를 공개했다. 이것은 MSDN에서 구할 수 있는데... 이 INETSDK를 이용해서 우리는 우리가 만든 ActiveX에 인증을 할 수있다.

사용방법은... 먼저 받은 INET SDK를 설치한다. 그리고 나서 아래의 순서대로 차례차례 따라해보자... 반드시 Command Line에서 해야 한다는 것을 주의하자...

1. SETREG 1 True

2. MAKECERT -n "CN=영재의 보증서" -sv Test.Pvk Test.Cer

3. [Create Private Key Password] 대화상자가 뜨며 암호를 요구하면
아무 거나 입력한다. 단 기억할 수 있는 암호로... ^^

4. CERT2SPC Test.cer Test.spc

5. 다시 대화상자가 뜨며 암호를 요구하면 아까 암호를 넣는다.
단, 안 물어보는 경우도 있다는 사실... ^^

6. SIGNCODE -spc Test.spc -v Test.Pvk -n "Test" Test.OCX
( 여기서 Test.OCX는 내가 만든 OCX의 이름으로 대체하면 된다. )

7. 또 대화상자가 뜨며 암호를 물어보면 아까 그 암호를 또 넣는다.
단, 이것도 안물어 보는 경우가 있다는 사실...

이렇게 해서 내가 만든 ActiveX에 인증 코드를 추가하였다. 쩝... 처음이 어렵지 해 보면 무척 간단하다... 5번까지 해서 만들어둔 .spc파일과 .pvk 파일은 두고 두고 써먹을 수 있다는 사실... 매번 6번만 다시 실행해 주면 된다.

단, 6번은 델파이의 Web Deploy Option 대화상자에서 Code Sign Project를 Check 해주고... Code Sign 탭으로 가서 'Credential File' 항목에 .SPC 파일을 넣어주고 'Private Key' 항목에 .PVK 파일을 넣어줌으로써 생략할 수 있다.



마치며...

지금까지 말도 안되는 소릴 지껄여 봤당... 흐...
혹시 본인과 같이 ActiveX 땜에 고민 했었던 분이 계시다면... 아마 큰 도움은 아니더라도 참고는 될 수 있을것이라 생각한다. 아직 못 다한 얘기가 있지만 ActiveX를 제작하고 Web에 올리는데 도움이 되는 얘기를 다음번에 한 번더 해 보도록 하자...
그럼 안농히~


Tags: activex 웹브라우져 윈도우즈 Share on Facebook Share on X

◀ PREVIOUS
how to record keyboard & mouse event
▶ NEXT
투명 윈도우 구현 방법
  Comments 0
Login for comment
SIMILAR POSTS

투명 윈도우 구현 방법 (created at 2006-09-29)

ActiveX를 Safe한 Component로 등록하는 방법 (created at 2006-09-29)

ActiveX의 등록 - Safe Code 넣어주기 (updated at 2023-12-17)

how to record keyboard & mouse event (created at 2006-09-29)

윈도우 찾아서 Top Most로 올려주기 (updated at 2023-12-17)

Application defined window call procedure (created at 2006-09-29)

스크린세이버 동작 못하게 막아주기 (created at 2006-09-29)

PC 셧다운 (shutdown) (created at 2006-09-29)

Application Event써서 Keyboard 받아내기 (created at 2006-09-29)

Web Browser Control에서 Enter키 먹게 하기 (created at 2006-09-29)

DirectShow에서 비디오 출력 크기 조정해주기 (created at 2006-09-29)

공유폴더 찾아주기 (created at 2006-09-29)

로컬 IP 알아내기 (created at 2006-09-29)

ShellExecute 실행 끝날때 까지 기다리기 (created at 2006-09-29)

String Find 알고리즘 (created at 2006-09-29)

HTTP Downloading Reference Source Code (created at 2006-09-29)

Starting an application as an icon in the system tray (created at 2006-09-29)

Extracting a Program's Version Information (created at 2006-09-29)

File Search Sample Code (created at 2006-09-29)

디렉토리 복사 루틴 (하부디렉토리까지 몽땅) (created at 2006-09-29)

디렉토리와 그 안에 있는 모든 파일 지우기 (created at 2006-09-29)

Create a standard windows shortcut file (created at 2006-09-29)

File Attribute 바꾸는 방법 (created at 2006-09-29)

모니터 끄는 API (created at 2006-09-29)

wave 파일 mixing 하기. (웨이브 믹싱) (created at 2006-09-29)

ATL/ActiveX 에서 자바스크립트로 데이터(문자열) 보내기 (created at 2006-09-29)

System Log-Off, Suspend, Reboot, Shutdown 시키기 (created at 2006-09-29)

GDI+ 에서 이미지 반투명 처리하기.. (created at 2006-09-29)

자기자신 IP알아내기(로칼컴퓨터) (created at 2006-09-29)

프로세스명으로 프로세스 죽이는 함수 (created at 2006-09-29)

OTHER POSTS IN THE SAME CATEGORY

cgi File Downloading Module (created at 2006-09-29)

Check Function - Is NT/2000/XP ? (created at 2006-09-29)

AES (Advanced Encryption Standard) Source Code (created at 2006-09-29)

File Search Sample Code (created at 2006-09-29)

Simple Socket Server based on C (created at 2006-09-29)

HTTP Downloading Reference Source Code (created at 2006-09-29)

String Find 알고리즘 (created at 2006-09-29)

UNIX에서 LOCALTIME 구하는 방법 & GetTicketCount() (created at 2006-09-29)

Web Browser Control에서 Enter키 먹게 하기 (created at 2006-09-29)

Application Event써서 Keyboard 받아내기 (created at 2006-09-29)

Application defined window call procedure (created at 2006-09-29)

윈도우 찾아서 Top Most로 올려주기 (updated at 2023-12-17)

ActiveX의 등록 - Safe Code 넣어주기 (updated at 2023-12-17)

ActiveX를 Safe한 Component로 등록하는 방법 (created at 2006-09-29)

투명 윈도우 구현 방법 (created at 2006-09-29)

how to record keyboard & mouse event (created at 2006-09-29)

스크린세이버 동작 못하게 막아주기 (created at 2006-09-29)

PC 셧다운 (shutdown) (created at 2006-09-29)

DirectShow에서 비디오 출력 크기 조정해주기 (created at 2006-09-29)

공유폴더 찾아주기 (created at 2006-09-29)

로컬 IP 알아내기 (created at 2006-09-29)

ShellExecute 실행 끝날때 까지 기다리기 (created at 2006-09-29)

Starting an application as an icon in the system tray (created at 2006-09-29)

Extracting a Program's Version Information (created at 2006-09-29)

디렉토리 복사 루틴 (하부디렉토리까지 몽땅) (created at 2006-09-29)

디렉토리와 그 안에 있는 모든 파일 지우기 (created at 2006-09-29)

Create a standard windows shortcut file (created at 2006-09-29)

File Attribute 바꾸는 방법 (created at 2006-09-29)

wave 파일 mixing 하기. (웨이브 믹싱) (created at 2006-09-29)

ATL/ActiveX 에서 자바스크립트로 데이터(문자열) 보내기 (created at 2006-09-29)

UPDATES

글루코사민 vs. 콘드로이친: 무엇이 더 나은 관절 건강 보조제일까? (created at 2024-04-22)

광주 5·18 민주화운동 알린 테리 앤더슨 前 AP 기자 (created at 2024-04-22)

햄과 소세지가 우리 몸에 일으키는 부작용 (updated at 2024-04-22)

콘드로이친의 염증 감소효과 (updated at 2024-04-22)

코사민 DS - 글루코사민+콘드로이친 복합물이 함유된 퇴행성 관절 건강보조제 (updated at 2024-04-22)

삼겹살 먹을때 환상조합 (created at 2024-04-22)

일본 여중생의 특이한 취향 (created at 2024-04-22)

우리가 먹는 약물이 바꿔버린 생태계 (created at 2024-04-21)

일본에서 그린 상상속의 사무직과 현실속의 사무직 (updated at 2024-04-21)

북한 미대생들이 그린 북한 최고존엄 김정은 (created at 2024-04-21)

입사 후 1년도 되지 않은 회사에서 구조조정에 의한 퇴직 불응에 따른 해고 처리시 대응 가능한 방법 (updated at 2024-04-20)

한고은님의 옛날 사진 (updated at 2024-04-20)

소녀대 - Bye Bye Girl (updated at 2024-04-13)

대한민국 날씨 근황 (created at 2024-04-13)

성일종 인재육성 강조하며 이토 히로부미 언급 - 인재 키운 선례? (updated at 2024-04-13)

일제강점기가 더 살기 좋았을지도 모른다는 조수연 국민의힘 후보 - 친일파? (updated at 2024-04-13)

Marshall Ha님의 샤오미 SU7 시승기 - 테슬라의 일론 머스크님이 긴장할만한 느낌 (updated at 2024-04-09)

윙크하는 귀염둥이 반려견들 (created at 2024-04-08)

달콤 살벌한 고백 (created at 2024-04-08)

북한 최정예 공수부대 훈련 모습 (updated at 2024-04-02)

맛있었던 친구 어머니의 주먹밥이 먹고 싶어요 (created at 2024-04-02)

자리 마음에 안든다고 6급 공무원 패는 농협 조합장 (created at 2024-03-26)

85세 딸 짜장면 사주는 102세 어머니 (created at 2024-03-26)

1990년대 감각파 도둑 (created at 2024-03-26)

치매에 걸린 69살의 브루스 윌리스가 전부인 데미무어를 보고 한 말 (updated at 2024-03-22)

경제는 대통령이 살리는 것이 아닙니다 라던 윤석열대통령 - 상황 안좋아지자 여러 전략을 펼쳤지만, 부작용 속출했던 2024년의 봄 (updated at 2024-03-13)

극빈의 생활을 하고 배운것이 없는 사람은 자유가 뭔지도 모를 뿐 아니라 왜 개인에게 필요한지에 대한 필요성을 못느낀다는 윤석열 대통령 (updated at 2024-03-08)

조선일보를 안본다는 사람들이 말하는 그 이유 - 천황폐하, 전두환 각하, 김일성 장군 만세? (created at 2024-03-07)

광폭타이어를 장착하면 성능이 좋아질거라는 착각 (updated at 2024-03-03)

면허시험장에서 면허갱신하면 하루만에 끝나나? (updated at 2024-03-03)