코딩하는 나귀

웹에서 ActiveX를 동작 시키는 아래와 같은 2가지 코드가 있다.

[HTML 코드]

<OBJECT id="Installer"
classid="clsid:A501DAB0-D975-C339-9758-848168155E06"
              codebase="Launcher.dll#version=1,0,0,0"
<param name="hello" value="0"></OBJECT>

[JavaScript 코드]

try {
  var myobj = new ActiveXObject("Launcher.LauncherForm");
  if (myobj != null) return true;
  else return false;
} catch(e) {
  return false;
}

개인적으로 밑에 코드가 더 좋지만 문제가 있다 바로 버전을 써주는 곳이 없다는 것!!!

그게 뭐가 문제가 있냐고 물으신다면... 있다... 문제 -_- 업그레이드 안된다.

치명적이다 새로운 API를 외부로 노출시켜서 수정했을 경우 아무리 DLL버전와 inf 정보를 수정해서

cab을 서버에 올려놔도 자바스크립 코드는 그걸 모른다. 왜냐하면... ProgID로 ActiveX를 로드 시키기 때문에

기존에 설치된 ActiveX가 있다면 로드하는데 문제가 없기 때문이다. 결국 서버쪽 스크립트에서

추가된 API를 호출하면 오류가 나는 상황이 벌어지는 것이다.

해결방법은 새로운 버전은 ProgID를 번경하고 DLL버전도 올리는 것이다.

ProgID를 변경하면 기존 설치된 PC에서도 로드가 안되서 예외로 빠질것이고 이때 새로운 ActiveX의

OBJECT 코드를 넣어 설치해주면 될 것이다. DLL버전을 올리는 이유는 당연히 기존과 버전이 같으면

코드를 만나도 설치창이 뜨지 않기 때문이다.

VS에서는 ProgID를 쉽게 고첬던거로 기역하는데 델파이는 ProgID를 변경하는 곳을 못찿았다...

없는건지 내가 못찿은건지 모르겠다... (아시는분 알려주세요오~ ^^;)

참새신랑님의 블로그에서 아래 소스파일을 주어왔다.


사용법은 uses에 추가한 뒤에 맨 밑에 팩토리 생성 부분 클레스를 오버라이딩 한것이다.

initialization
  TSafeActiveFormFactory.Create(
    ComServer,
    TActiveFormControl,
    TaxUMainMap,
    Class_axUMainMap,
    1,
    '',
    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    tmApartment).DeployVersion := '1.0';

이렇게 하고 나서 자바스크립코드에서는

var myobj = new ActiveXObject("Launcher.LauncherForm.1.0");

이런 식으로 로드하면 된다.


ps. 이게 싫어서 ActiveX를 스스로 업그레이드 하도록 코딩하는 것도 다른 한 방법이다.
      예전에 그렇게 해봤고 그렇게 했던 이유는 설치되 있는데 또 설치창이 나타나는게
      꼴보기 싫어서 그랬다; ActiveX는 버전이 바뀌면 또 설치해야한다... -_-