You cannot see this page without javascript.

OCX --> CAB 작성

Programing 조회 수 2846 추천 수 0 2014.06.13 10:51:30

배포하기(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이 생성된다.

MakeActiveXPass.jpg


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 컨트롤 다운로드(리스트의 아래쪽에 있음)를 사용 안함에서 확인으로 변경

 

 

 

 

 

 

 

ActiveX를 만들어 테스트 할 때 뜨는 배포에 관한 부분과, 보안 경고창에 관한 것을 처리하다가

혹시나 필요하신 분을 위하여 적어봅니다.

일단 배포할 때 뜨는 경고창을 없애고 테스트 인증창을 보여주어 깔끔하게 마무리하구여..

(물론 테스트 인증이므로 -> 이것은 테스트 인증입니다.. 라고 나오지만 돈 안드니까.. ^^)

보안 문제를 코드로 해결하여 보안 수준을 설정하여야 하는 번거로움을 없애는 게 목적입니다.

 

-> 참고자료

ActiveX 인증 : MSDN - Net Framework Tools (Security Tools) 참고.

ActiveX 보안 : [Tip&Trick] 김병무님께서 올리신 글 참고

(보안에 관한 부분은 김병무님의 글을 읽어 보세요. 이미 있는 글이므로 따로 올리지 않습니다.)

 

여기에 사용된 툴들은 Win32 Platform SDK에 포함되어 있습니다.

이것을 전부 설치하기 짜증나시면 MSDN에 들어가셔서 Internet SDK만 따로 다운받으시되

버전에 따른 차이가 있으니까 잘 골라서 받으세욤. (2가지 있슴당 5.0 이상 버전과

4.0 이하버젼.. 물론 인터넷 익스프롤러 버젼을 말하죠.)

 

-> 시작하기 전에

제가 만든 OCX를 crowback.ocx라고 가정하고 현재 버전은 1,0,0,1 이라고 전제합니다.

 

-> 1. INF 파일 만들기.

inf 파일은 OCX를 CAB로 압축하고 나중에 웹상에서 배포할 때, 어디에 설치가 되는지 경로와

자동 레지스트리 등록에 관한 부분을 설정합니다.

 

; INF file for crowback.ocx
[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
crowback.ocx=crowbackt.ocx  // 내가 만든 ocx 이름

[crowback.ocx]                       // 내가 만든 ocx의 레이블
file-win32-x86=thiscab             // 설치할 ocx가 현재 inf가 포함된 CAB 파일내에 있음.
clsid={90893A43-6CB1-11D3-B099-00104B0B34CC} // crowback.ocx의 클래스 아이디
FileVersion=1,0,0,1                   // 배포파일의 버젼
RegisterServer=yes                 // 자동 레지스트리 등록
;DestDir=11                              // Windows/System 폴더

위에서 보라색으로 칠해진 부분은 각자가 맞게 설정하여야 하는 부분입니다.

그리고 녹색은 주석이니 INF 파일에 넣으시면 않되겠죠? ^^

 

-> 2. 테스트 인증 루트 만들기.

현재 내가 OCX를 배포할 때 인증 경로라는 것이 존재하여야 합니다.

이를 위하여 내컴터를 루트로 하는 테스트 인증 경로를 만듭니다.

아래의 명령어를 도스창에서 입력합니다.

원문 : The Set Registry tool allows you to change the registry settings for public key cryptography. These keys, called the Software Publishing State Keys, control the behavior of the certificate verification process. After Setreg.exe completes the requested action, it displays the current values of the Software Publishing State Keys.

SETREG 1 TRUE

 

-> 3. 암호화와 사인 넣기

일단 배포하기전에 인증에 관한 암호화를 실행하고, 나의 사인(이름)을 넣는 작업입니다.

원문 : The Certificate Creation tool generates X.509 certificates for testing purposes only. It creates a public and private key pair for digital signatures and stores it in a certificate file. This tool also associates the key pair with a specified publisher's name and creates an X.509 certificate that binds a user-specified name to the public part of the key pair.

Makecert.exe includes basic and extended options. Basic options are those most commonly used to create a certificate. Extended options provide more flexibility.

MAKECERT -n "CN=CROWBACK" -sv crowback.pvk crowback.cer

 

-> 4. 인증서 만들기

일단 위의 과정이 끝나면 위에서 만든 파일들로 실제적인 테스트 인증서를 만들어야 합니다.

원문 : The Software Publisher Certificate Test tool creates a Software Publisher's Certificate (SPC) from one or more X.509 certificates. Cert2spc.exe is for test purposes only. You can obtain a valid SPC from a Certification Authority such as VeriSign or Thawte. For more information on creating X.509 certificates

CERT2SPC crowback.cer crowback.spc

 

-> 5. 압축하기

위의 과정들이 끝나면 일단 압축을 합니다. 원래 OCX에다가 인증서를 첨부하지만 그럴 경우

INF 파일에 따로 인증을 하여야 하고, 다시 CAB에 인증을 하여야 하기 때문에 다 압축한 후

CAB 파일에만 인증서를 첨부하는 방법을 선택하였습니다.

CABARC -s 6144 N crowback.cab crowback.inf crowback.ocx

 

-> 6. 인증서 첨부하기

이렇게 인증서와 CAB 파일을 만들고 나서 배포하기 전에 인증서를 CAB 화일에 첨부를 합니다.

SIGNCODE -spc crowback.spc -v crowback.pvk -n "crowback ActiveX" -i http://www.devpia.com crowback.cab

 

-> 7. 웹에다 배포하기.

일단 이렇게 만들어진 넘을 웹서버에다가 올려서 실제로 배포를 해봐야 겠지요?

아래는 테스트용 HTML 코드의 일부분 입니다.

<OBJECT ID=crowback style="position:absolute" CODEBASE="http://www.myserver.com/crowback.cab#version=1,0,0,1" WIDTH=300  

HEIGHT=100 CLASSID="CLSID:80B81906-26F5-11D6-B5D2-0050BF79AAF5"></OBJECT>

위에서 CODEBASE는 ActiveX가 올라간 웹서버의 경로와 파일 버젼을

CLASSID는 ActiveX의 클래스 아이디를 적으시면 됩니다.

첨부
엮인글 :
List of Articles
번호 제목 글쓴이 날짜 조회 수

XE Login