'gecko'에 해당되는 글 2건

  1. [2006/09/30] Gecko Plugin Method 주의점...
  2. [2006/09/18] 모질라 파운데이션의 거짓말... XPTPath... (1)

Gecko Plugin Method 주의점...

[프로그래밍 팁/윈도우 프로그래밍]

지난 금요일 오전 이틀간의 삽질이 끝났다.
아니... 그동안 개발과 중단의 반복된 시간들로 보면
Plugin 전체로는 한두달 정도 끌어온 작업인듯...

어쨌거나 이만큼 질질 끌며 나를 괴롭혀 오던 작업은
정말 허무한 삽질로 결말이 나고 말았다.
삽질의 원인은 대소문자... -_-a
정말 초보적 실수의 극치라 부를 수 있는 문제로 삽질을 했다는 것이 심히 괴롭다.

COM을 이용한 ActiveX에서는 인터페이스 정의를 마법사가 거의 알아서 해준다.
이 때, 노출되는 인터페이스는 '*.idl'파일에 기술되며 MIDL 도구로 컴파일되고,
이것은 ActiveX 구현 파일과 연결된다.

그러나 Mozilla Plugin에서는 조금 다르다.
물론 인터페이스는 역시 '*.idl'파일에 기술되지만,
gecko-SDK와 함께 배포되는 'xpidl'이라는 도구로 컴파일 된다.
컴파일 된 후에는 헤더파일과 '*.xpt' 두가지 파일이 생성되는데
인터페이스 구현을 위해 위에 생성된 헤더를 상속받는 인터페이스 클래스를 따로 구현해야만 한다.

요약하면, ActiveX는 인터페이스가 구현 자체와 완전하게 결합되어 있지만,
Mozilla Plugin은 인터페이스와 구현이 완벽하게 분리되어 있다.
두 특징은 나름의 장단이 있지만,
개인적으로는 Mozilla Plugin 쪽이 좀 더 나은 방법이 아닌가 생각한다.

Mozilla Plugin에 대한 자세한 얘기는 그만 제끼기로 하고, 문제의 핵심은 이렇다.
아래는 Plugin에 쓰이는 '*.idl' 파일이다.

#include "nsISupports.idl"
[ scriptable, uuid(420E6934-B57F-4283-8F99-0F37F609F55E) ]
interface nsIPluginTest : nsISupports {
  void button1();
  void button2();
};

분명히 두 인터페이스는 소문자로 b로 시작한다.
그러나...
class NS_NO_VTABLE nsIPluginTest : public nsISupports {
public:
  NS_DEFINE_STATIC_IID_ACCESSOR(NS_IPLUGINTEST_IID)
  /* void button1 (); */
  NS_IMETHOD Button1(void) = 0;
  /* void button2 (); */
  NS_IMETHOD Button2(void) = 0;
};

xpidl 컴파일 도구에 의해 생성된 헤더에는 대문자 B로 변경되어 있다.

이것이 삽질의 원인이다. -_-a
Plugin에서 인터페이스는 기본적으로 '*.idl'에 기술되어 있는 대소문자를 따른다.
그런데 나는 헤더를 상속받아 사용했기 때문에
첫문자가 b가 아닌 B라고 철썩같이 믿고 스크립트에 대문자 B로 기술했기 때문에
Method가 전혀 동작하지 않은 것이다.
그런줄도 모르고 하단의 QueryInterface까지 내려가 이잡듯이 샅샅이 뒤집어 엎던 황당함이란...

뭐, 금요일의 어이없는 삽질도 이렇게 막을 내렸다.
하~
2006/09/30 17:33 2006/09/30 17:33

모질라 파운데이션의 거짓말... XPTPath...

[프로그래밍 팁/윈도우 프로그래밍]
지난주 금요일 저녁부터 시작한 모질라 플러그인의 인터페이스 연결 작업...
이번 과제는 플러그인 DLL과 XPT 인터페이스 파일을
같은 폴더에 둔 상태에서 웹으로 연결시키는 것이었다.

이와 같은 요구의 원인은
바로 'Nescape Plugin'과 'ActiveX' 모듈의 일체화 작업 때문...
무슨소리냐 하면,
윈도우 기반의 브라우져라면
IE, Firefox, Mozilla, Opera를 막론하고
모두 하나의 단일 모듈로 동작 가능하도록 하겠다는 말이다.

문제의 핵심은 그것이 가능한 것인가?

ActiveX는 COM interface 기반이므로 IE가 CLSID를 통해
ActiveX의 모든 interface에 접근 가능하다.
그러나 Nescape Plugin은 interface description을 .xpt 파일로 분리하고
브라우저가 실행될 때,
설치폴더 하위의 plugin 관리 폴더에서 모든 플러그 인의 정보를 갱신하여 사용한다.
문제는 interface가 분리되어 있단는 것과 특정폴더에 로드해야 한다는 것...
이 문제를 해결해 줄 달콤한 기술문서가 아래에 있다.

http://www.mozilla.org/projects/plugins/first-install-problem.html

이미 레지스터에 Path 등록을 통해 dll의 위치 제한을 풀었던 터라
아무 의심없이 XPTPath를 이용해 해결하면 되리라 믿었던 나...
그러나 회의시간이고 나부랭이고 다 빼더라도
장장 5시간 이상 삽질을 시도했으나 전혀 기대대로 동작할 기미가 보이지 않았다.
결국 구글 그룹스 형님에게 도움을 요청한 결과
다음과 같은 충격적인 결말을 보고야 말았다.

http://groups.google.co.kr/group/mozilla.dev.tech.plugins/browse_thread/thread/63fd56d67eb1d98e/7bdca15018131b85?lnk=st&q=XPTPath+plugin&rnum=1&hl=ko#7bdca15018131b85

급기야 도저히 믿기지 않아
Plugin 서비스를 관리하는 아래의 소스코드를 열어보았다.

http://lxr.mozilla.org/seamonkey/source/modules/plugin/base/src/nsPluginDirServiceProvider.cpp#567

그 결과는 충격...
완전히... 당했다... ㅜ.,ㅡ

뭐, 이런 양질의 브라우져를 공짜로 공급해주니까
당했다는 표현이 심하긴 했지만, 고생을 생각하면... 으드득...

아무튼... 내일이 마감인데...
이 문제를 타개할 방법을 찾아 이제부터 다시 시작을... 흑흑흑...
2006/09/18 16:13 2006/09/18 16:13