배포하기(Cab 파일 작성법)
ActiveX 컨트롤(.OCX)을 웹페이지에 포함하여 다른 PC에서 그 페이지를 열면 제대로 동작하지 않는다. 제대로 동작하게 하기 위해서는 ActiveX 컨트롤을 각 PC에 복사하고 그 컨트롤을 레지스트리에 등록해주어야만 한다. 또한 필요한 DLL이 있다면 그 DLL 또한 복사해 주어야한다. 이 일련의 작업들을 자동으로 해주는 것이 Cab 파일이다.
Visual Basic에서는 배포 마법사라는 프로그램이 있어 이 Cab 파일을 쉽게 만들 수 있다. 그러나 Visual C++은 .... 필자가 근 1년을 헤매다가 겨우 찾았다.
ActiveX 컨트롤이 만들어진 상황에서 Cab 파일을 만드는 작업 순서를 보면 다음과 같다.
1. .inf 파일을 작성한다.
2. .ocx 파일과 .inf 파일을 .cab 파일로 압축한다.
3. .cab 파일을 서명한다.
4. .cab 파일을 웹페이지에 등록한다.
.inf 파일 작성법
.inf 파일은 Visual Basic에서는 배포마법사에서 VB project를 설정하여 .inf 파일이 자동으로 생성되어 .cab 파일에 포함된다. 그러나 Visual C++로 프로그램했다면 불행히도 수동으로 작성해야만 한다. 작성 예를 보면 다음과 같다. ; ========================= test.inf ========================
; This .inf file will control the installation of the MFC test
; control. This control has been compiled with Visual C++ version 4.2.
; The FileVersion tags in the dependent DLLs section on this file
; reflect this requirement.
[version]
; version signature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
test.ocx=test.ocx
; These are the necessary supporting DLLs for MFC 4.2 ActiveX Controls
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
; dependent DLLs
[msvcrt.dll]
; This is an example of conditional hook. The hook only gets processed
; if msvcrt.dll of the specified version is absent on client machine.
FileVersion=6,0,8168,0
hook=mfc42installer
[mfc42.dll]
FileVersion=6,0,8168,0
hook=mfc42installer
[olepro32.dll]
FileVersion=5,0,4261,0
hook=mfc42installer
[mfc42installer]
file-win32-x86=<LINK TYPE="GENERIC" VALUE="http://activex.microsoft.com
/controls/vc/mfc42.cab">http://activex.microsoft.com/controls/vc
/mfc42.cab</LINK>
; If dependent DLLs are packaged directly into the above cabinet file
; along with an .inf file, specify that .inf file to run as follows:
;InfFile=mfc42.inf
; The mfc42.cab file actually contains a self extracting executable.
; In this case we specify a run= command.
run=%EXTRACT_DIR%\mfc42.exe
; thiscab is a keyword which, in this case, means that test.ocx
; can be found in the same .cab file as this .inf file
; file-win32-x86 is an x86 platform specific identifier
; See the ActiveX SDK - ActiveX Controls - Internet Component Download -
; Packaging component code for automatic download
[test.ocx]
file-win32-x86=thiscab
; *** add your controls CLSID here ***
clsid={0D886696-C7CE-11D3-A175-08002BF17507}
; Add your ocx's file version here.
FileVersion=1,0,0,1
RegisterServer=yes
위의 내용 중 test를 자신이 작성한 ActiveX 컨트롤의 이름으로 변경하고 중간에서 약간 위의 clsid={0D886696-C7CE-11D3-A175-08002BF17507}를 자신이 작성한 컨트롤의 clsid로 수정하면(clsid는 ActiveX 컨트롤을 만든 디렉토리의 .odl 파일을 열어 가장 마지막에 나와 있는 id를 입력하면 된다)보면 .inf 파일 작성은 완료된다.
참고로 inf 파일의 내용을 대강 정리하면 다음과 같다.
세미콜론(;) : 주석문을 표시한다.
[Add.Code] : 설치할 파일들을 나열한다.
test.ocx=test.ocx
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
즉 test.ocx, mfc42.dll, msvcrt.dll, olepro32.dll을 설치한다는 의미이다. 그다음 부터는 [Add.Code]에서 설정한 파일들의 속성을 설정한다.
[test.ocx]
file-win32-x86=thiscab
clsid={0D886696-C7CE-11D3-A175-08002BF17507}
FileVersion=1,0,0,1
RegisterServer=yes
clsid는 작성한 OCX 파일의 CLSID를 입력한다.
FileVersion은 작성하] OCX 파일의 버전을 입력(Resource에서 설정한 값과 같이 입력)한다. 설명상 FileVersion은 ActiveX 파일을 작성하여 배포하던 중 버그를 발견하여 수정하여 재 배포를 할 때 이 파일 버전을 높여 주면 Client에서 알아서 다시 다운로드를 받는다 라고 되어 있었는데 필자가 테스트 해보니 잘 되지 않았다. 테스트 해보기 바란다.
나머지 파일들은 Visual C++로 ActiveX 프로그램을 작성했을 때 일반적으로 필요한 dll 파일들이다. 만약 같은 버전의 Visual C++이 설치되어 있으면 설치 되지 않고 그렇지 않으면 설치된다.
[msvcrt.dll]
FileVersion=6,0,8168,0
hook=mfc42installer
FileVersion은 설치될 dll의 버전이다. 현재 inf 설명에 적어 놓은 버전은 Visual C++ 6.0으로 프로그램 했을 경우 버전들이다.
hook은 설치할 방법을 설정하는 부분의 Title을 입력한다.
[mfc42installer]
file-win32-x86=<LINK TYPE="GENERIC" VALUE="http://activex.microsoft.com
/controls/vc/mfc42.cab">http://activex.microsoft.com/controls/vc
/mfc42.cab</LINK>
run=%EXTRACT_DIR%\mfc42.exe
http://activex.microsoft.com/controls/vc/mfc42.cab으로부터 다운로드하여 부가적 dll을 설치하도록 설정한 것이다.
.cab 파일 생성
.cab 파일을 생성하기 위해서는 cabarc.exe라는 프로그램이 필요하다. 이 프로그램은 아래 다운로드에서 다운로드가 가능하다.
.cab 파일 생성 예를 들면, test.ocx라는 ActiveX 컨트롤을 제작하였고 test.inf를 작성하였다면 test.cab 파일은 도스창에서 다음과 같이 입력하면 만들어 진다.
cabarc.exe N test.cab test.ocx test.inf
제공하는 파일(아래 다운로드에서 .zip 파일을 받아 압축을 푼 파일)에서 step1.bat를 실행하면 위 과정이 실행된다. 물론 step1.bat를 열어 test를 제작한 ActiveX 컨트롤 이름으로 변경하고 그 .ocx파일과 .inf 파일을 제공하는 파일과 같은 위치에 복사한 후 step1.bat를 실행해야 한다.
.cab 파일 서명
명령 프롬프트에서 다음 명령줄을 입력하면 다음과 같은 대화 상자가 생성되어 암호를 입력하면 개인 키 파일 mycert.pvk 및 mycert.cer이 생성된다.
makecert -sv "mycert.pvk" -n "CN=JYS ActiveX" mycert.cer
명령 프롬프트에서 다음 명령줄을 입력하면 mycert.cer로부터 mycert.spc 파일을 생성한다.
cert2spc mycert.cer mycert.spc
여기 까지 과정은 한번만 수행하면 된다. 제공하는 파일에서 makespc.bat를 실행하면 위 과정이 실행된다.
명령 프롬프트에서 다음 명령줄을 입력하면 위의 개인 키 암호 입력 대화 상자가 생성되고 위 과정에서 입력한 암호와 같은 암호를 입력하면 .cab 파일에 서명한다.
signcode -v mycert.pvk -spc mycert.spc test.cab
위와 같이 입력하면 테스트용으로 .cab 파일을 인증한다. 만약 인증 기관에서 제대로된 인증을 받으려면 위 명령줄에 -t 인증기관 url을 추가해야 한다. 그러나 인증 기관에서 인증을 받으려면 돈을 내야하고 테스트용 인증은 단지 웹 페이지를 처음 열었을 때 대화 상자 하나 더 뜬다는 것만 다르므로 제대로된 인증을 받을지는 여러분이 판단하기 바란다.
명령 프롬프트에서 다음 명령줄을 입력하면 하면 테스트 인증서가 인식되도록 클라이언트 시스템에서 TRUE 값으로 Setreg.exe가 실행된다.
setreg -q 1 TRUE
Checktrust.exe를 실행하여 CAB 파일이 올바르게 서명되었는지 확인한다.
chktrust test.cab
제공하는 파일에서 step2.bat를 열어 test를 제작한 ActiveX 컨트롤 이름으로 변경한 후 step2.bat를 실행하면 위 과정이 실행된다.
웹 페이지 등록
.cab파일을 웹 페이지에 등록하기 위해서는 OBJECT 태그의 CODEBASE를 사용한다. 다음은 test.ocx를 삽입한 html 파일의 예이다. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<base target="detail">
<title>TaskForce</title>
<meta name="generator" content="Namo WebEditor v3.0">
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<p><object classid="CLSID:0D886696-C7CE-11D3-A175-08002BF17507" codebase="test.CAB#version=1,0,0,1"
width="300" height="330" id="test">
</object>
</p>
</body>
</html>
위에서 CLSID:0D886696-C7CE-11D3-A175-08002BF17507, test.cab, version=1,0,0,1을 자신이 만든 ActiveX 컨트롤에 맞추어 변경하면 된다. version은 작성한 ActiveX 컨트롤의 resource의 version을 확인하여 입력한다.
보안 설정
예전에는 인터넷 익스플로어가 인증 기관으로부터 인증을 받지 않은 ActiveX(서명 안된 ActiveX로 표현)를 확인에 의해 사용하도록 기본 세팅되어 있었는데, 요즘은 그 세팅이 사용안함으로 되어 있다. 따라서 인터넷 익스플로어에서 다음과 같이 설정을 해주어야만 ActiveX를 사용할 수 있다.
도구 메뉴 -> 인터넷 옵션 ->두 번째 탭 보안 -> 사용자 지정 수준 -> 서명 안된 ActiveX 컨트롤 다운로드(리스트의 아래쪽에 있음)를 사용 안함에서 확인으로 변경