CAB 파일 작성법

1  inf파일을 작성한다.
컨트롤을 실행하기 위해 필요한 다운로드 받거나 있어야 파일의 정보가 텍스트로 명시되어 있는 파일이다
atltest.INF 

샘플의 DLL 명칭이 atltest.dll이다.  다른 dll이라면 atlstest 대신 치환 해주면 된다.
clsid는 atltest.htm에 있는 clsid를 적어주면 된다.

참고- MFC로 ATL 사용시  원본: http://jys92.com.ne.kr/VisualC/MakeCab.htm

.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을 설치하도록 설정한 것이다.

 

2. CAB 파일로 묶기
atltest.cab으로 묶어 보자. 보통 사용되는건 2가지 옵션이다.  어느쪽을 사용하던 특별한 문제는 없다.

D:\CAB&SIGN\CABARC -s 6144 atltest.CAB ATL.DLL atltest.DLL atltest.INF 

-s cab파일을 묶을 때, 6144만큼 크기를 예약한다.

D:\CAB&SIGN\CABARC N atltest.CAB ATL.DLL atltest.DLL atltest.INF 

N은 새로운 캐비넷을 만들 때 사용하는 옵션이다.

3. CAB 파일 서명

Test 서명만 할 경우에는 여기에서 다운로드  받아서 사용하기를 바란다. 자세한 설명은 readme.txt도 압축파일안에 같잉 있다.

원문: http://digital2000.pe.kr/htmls/eng/activex/internet/cabsign.html

http://jys92.com.ne.kr/VisualC/MakeCab.htm

생성된 .cer파일을 spc 파일로 바꾸기

cer2spc test.cer test.spc

signcode를 실행하여 인증화일을 배포화일에 Sign 한다.

<보안인증 Sign 하기>: 도스창에서 작업한다.
- 사용방법: signcode -v [*.pvk 파일명] -spc 파일명] [*.CAB화일명]

d:\atltest>d:\signcode\bin\singcode -v atltest.pvk -spc atltest.spc atltest.CAB

- 인증화일에 대한 암호를 입력한다.(인증화일을 다운로드할 때 입력한 암호를 입력합니다.)

 

성공적으로 인증이 되면 다음과 같은 메시지를 도스창에서 볼 수 있다.

Warning: This file is signed. but not timestamped.
Succeeded.

인증 내용을 확인하고 싶다면 bin디렉토리에서 chktrust.exe atltest.exe를 실행한다.
[아니오]버튼을 클릭한다.
 

성공적으로 인증확인이 되었다면 다음과 같은 메시지를 보게된다.(여기서 난 테스트 버전을 사용했다.)

The subject is not trusted for the specified action
Result = 900b001. (-1143456890)

 

 4. 사용권한 파일 작성:

lpk_tool.exe를 실행하여 해당하는 ActiveX Control을 찾는다(여기서는 SampleCtrl Class이다).
그리고 [Add -> ]버튼을 누른다.
ActiveX 컨트롤을 포함한 HTML 문서에 "*.LPK"파일을 명시하지 않으면 ActiveX 컨트롤이 제대로 실행되지 않는다.

 

위에서 [Save & Exit]버튼을 누른다. 그리고 atltest.lpk를 입력하고 [저장]버튼을 누른다.
HTML 문서가 위치한 경로 또는 원하는 위치에 "*.LPK" 파일을 작성한다.

성공적으로 작성되었다는 메시지가 뜰 것이다.

 

5. HTML 표시

http://digital2000.pe.kr/htmls/eng/activex/internet.html
http://digital2000.pe.kr/htmls/eng/activex/internet/webdisp.html

사이트의 내용이 잘되어 있기 때문에 그대로 퍼온내용이다.

ActiveX 컨트롤을 웹 브라우저에 표시하기


HTML 문서에 추가하기
1. HTML Sample 을 참조 합니다.
- 응용프로그램 마법사를 사용하여 배포화일(CAB)을 작성한 경우, 해당 ActiveX 컨트롤에 대한 HTML Sample CODE 가 작성됩니다.
- Sample HTML CODE 를 참조하여 사용자가 원하는 위치에 ActiveX 컨트롤을 표현해 보세요.
- "OBJECT" 태그를 사용하여 컨트롤 ID 및 크기, CLSID, 버젼정보, 배포형태 등을 기술 합니다.
※ "CLSID" 는 시스템 레지스트리에 기록된 라이선스 정보 입니다.
※ 배포형태는 "*.OCX" 형식을 사용할 수 있으나 정상적인 다운로드 및 실행을 보장할 수 없습니다.


☞ Sample HTML CODE


2. 라이선스 패키지 화일 첨부
- 라이선스 패키지 화일(*.LPK) 정보를 첨부 합니다.
- "*.LPK" 화일 작성 방법은
(여기를 클릭 하세요.)
- "*.LPK" 에 대한 CODE 를 먼저 기술한 뒤, ActiveX 컨트롤에 대한 HTML CODE 를 기술 합니다.
※ 라이선스 패키지 화일에 대한 정보를 기술하지 않을 경우, ActiveX 컨트롤이 웹 브라우저에 제대로 표시되지 않습니다.


☞ "*.LPK" 화일정보 추가


3. ActiveX 컨트롤에 대한 속성값 설정
- ActiveX 컨트롤이 가진 고유의 속성값을 HTML 태그를 사용하여 입력할 수 있습니다.
- "PARAM NAME" 태그를 사용하여 속성 이름 및 속성값을 추가 합니다.
※ (주의) 이와같은 방법은 웹브라우저에서 "스크립트 실행" 여부를 묻는 경고 메세지를 표시하게 만듭니다.


☞ 컨트롤 속성값 입력