들어가며...
얼마전 까지만 해도 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에 올리는데 도움이 되는 얘기를 다음번에 한 번더 해 보도록 하자...
그럼 안농히~