이틀을 공치고 다른분들은 좀 편히 하시길 바라며...
제가 한 방법이며 어떤 특정상황에서 어떤 에러가 발생할지는 아직 모릅니다.
발생하는 족족 글을 추가하도록 하겠습니다.
시작
new -> ActiveX -> Active Form 으로 생성하면 옵션창이 보입니다.
체크 가능한 CheckBox 모두 체크 하지 않습니다.
* 첨부한 이미지 1을 참고하세요
Ctrl + Shift + F11 (Project Manager) 를 열어
(Project Manager 내용은 다른 파일의 배포 없이 사용이 가능하도록 설정하기 위함입니다.)
Packages 탭의 하단에 있는 Rungtime packages 의 체크를 제거합니다.
Linker 탭의 Linking 중 Use dynamic RTL을 제거합니다.
프로젝트 메니져 설정 종료.
*이미지 2,3을 참고하세요
Active Form의 해더파일에 (이부분은 경고창 뜨는것을 제거하기위함입니다.)
class ATL_NO_VTABLE TActiveFormXImpl:
VCLCONTROL_IMPL(TActiveFormXImpl, ActiveFormX, TActiveFormX, IActiveFormX, DIID_IActiveFormXEvents),
public IPersistPropertyBagImpl <TActiveFormXImpl>,
public IObjectSafetyImpl <TActiveFormXImpl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
위 부분을 수정하시고
BEGIN_COM_MAP(TActiveFormXImpl)
VCL_CONTROL_COM_INTERFACE_ENTRIES(IActiveFormX)
COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
BEGIN_CATEGORY_MAP(TActiveFormXImpl)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()
BEGIN_PROPERTY_MAP(TActiveFormXImpl)
// PROP_PAGE(CLSID_ActiveFormXPage)
PROP_ENTRY("CODE", 16, CLSID_ActiveFormX)
END_PROPERTY_MAP()
위 3개를 추가하시는데 없는것(가운데 카테고리부분)은 그대로 작성하시고
다른 부분은 추가할 부분만 추가하여 주십시오
맨 마지막의 PROP_ENTRY()은 Param을 받을 때 사용하기위해 제가 선언한 것이며 필요없으신 분은
추가하지 마시기 바랍니다. (또한 파라미터 받는것에 대한 내용은 QnA의 내용을 참고하시기 바랍니다.)
Project의 Web Deplyment option을 열어
Use CAB File Compression 은 체크 하지 않으며
나머지는 모두 체크하셔도 큰 상관 없습니다. *이미지 4를 참고하세요
기타 필요설정은 읽어보시고 직접 작성하시기 바랍니다.
이제 Build All 하시고 Web Deploy를 하시기 바랍니다.
(ocx가 사용중이라 덮어쓰기가 안된다는 메시지가 뜨는경우에는 관여마시고 다음을 진행하시기 바랍니다.
* 수동 cab file 만들기
cabarc -s 6144 n 생성할파일명.cab *.ocx *.inf(혹은 특정파일명)
(-s 6144 : 인증서가들어갈 크기로써 6144입니다. 실제 같은 파일을 -s옵션 없이 압축해보면 6144만큼 작은 용량으로 나타날 것입니다.)
배포에 앞서 작업에 필요한 파일들은 InetSDK입니다.
인터넷을 뒤져보시면 어렵지 않게 구하실 수 있으며 singcode.exe는 포럼에도 있으니 참고하시기 바랍니다.
signcode를 설치하시고 dos command를 실행하여
설치된 폴더의 inetsdk/bin 으로 이동하세요 (ex. c:\>cd inetsdk/bin)
위에서 준비된 cab file을 inetsdk/bin 폴더로 복사합니다.
아래부터 순서대로 작업합니다.
setreg 1 true
파일명은 원하시는 이름으로 설정하세요.
makecert -n "CN=인증서이름" -sv 파일명.pvk 파일명.cer
파일명.cer은 위에서 사용한 파일명.cer과 동일하여야 합니다.
cert2spc 파일명.cer 파일명.spc
마지막으로 cab 파일에 서명을 추가해줍니다.
(위에 사용한 파일명.확장자는 아래에서 모두 동일하여야 합니다.)
signcode -spc 파일명.spc -v 파일명.pvk -n www.홍길동.com 파일명.cab
설명 : signcode (실행파일명)
-spc (위에서 사용한 파일명.spc)
-v (위에서 사용한 파일명.pvk)
-n (인증서의 이름)
파일명.cab (위에서 복사한 cab파일명)
이외 다른 설정도 가능합니다.(인터넷을 검색해보시면 자세한 설명을 보실 수 있습니다.)
(한번 생성한 서명파일들은 재사용이 가능하며 cab파일에 다시 쓰고자 하실때는 setreg 1 true 부터 실행하시고 signcode 하셔야 됩니다. setreg 1 true 하지 않고 signcode 하시면 작업은 성공되지 않을것입니다.) 또한 batch 파일로 생성해두시고 사용하시면 간편할 수 있습니다.
lpk파일이 필요한 경우는 Tip'sNTrick의 임승균.조로 님이 쓰신 글(86번)을 참고셔시기 바랍니다.
일반적으로 위의 규칙을 지키셨을경우에는 LPK 파일은 필요하지 않습니다.
HTML의 소스입니다.
OBJECT
classid="clsid:11111111-1111-1111-1111-111111111111"
codebase="
http://cabfile이 있는 완전경로/ActiveFormProj1.cab#version=1,0,2,0"
width=350
height=250
align=center
hspace=0
vspace=0
>
</OBJECT
cab 파일과 lpk 파일은 서버에 올려놓으시면 됩니다.
(본인 컴퓨터의 경로를 적어도무방합니다만 다른 사람들은 동작하지 않겠지요?.)
좀더 말을 붙이자면
생성된 html은 ActiveFormProj1.inf" 라는 형태로 되어있으니 ActiveFormProj1.cab#version=x,x,x,x 으로 바꿔주시기 바랍니다.
페이지를 열때마다 설치가 뜨는경우는 version 이 맞지 않아서입니다.
1.3 의 버전일경우 1,0,3,0 입니다.
[2차수정내용]
버전이 반듯이 , 콤마여야 합니다.
. 닷의 경우에는 버전이 잘못되거나 이전버전으로 표시될 수 있으며
이때는 아무리 버전을 하향조정하여도 계속 받게 됩니다.
또한 OCX 하나만 배포할 경우에는 inf 파일은 필요하지 않군요
그냥 ocx만 cab으로 압축하여 인증서를 붙여서 배포하며 웹페이지에 버전으로만 버전체크를 하여 받게됩니다.
낮은 버전의 ocx라 하여도 웹페이지에 설정된 버전을 비교하여 자동패치여부를 결정하게됩니다.
이 사항은 inf를 사용하여도 마찬가지이오니 착오없으시기 바랍니다.
inf의 사용은 ocx이외 다른파일도 같이 cab으로 압축하여 사용할 경우에 사용하세요
[2차 수정 끝]
ocx의 버전 확인방법 : 해당 ocx 파일의 등록정보를 보세요
inf파일 수정 방법 :
;C++Builder-generated INF file for LoveTokyActiveFormProj1.ocx
[Add.Code]
ActiveFormProj1.ocx=ActiveFormProj1.ocx
[ActiveFormProj1.ocx]
file=thiscab
clsid={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
RegisterServer=yes
FileVersion=1,0,2,0
fileversion은 ocx버전 확인을 통한 버전으로 작성하시고 무조건 재설치 하시기 원하신다면 -1,-1,-1,-1로 설정하시면 됩니다.
이글을 읽어보시고 이해가 잘 안되는 부분은 임승균.조로님이 팁란에 적은 글을 참고하세요
기타 잔기술들이 터득되는데로 글을 쓰도록 하겠습니다.