JCom(Java-COMブリッジ)



現在開発中の次期バージョンの内容について

JComはVer1.0では実験的なソフトだったのですが、Ver2.00で リリース漏れの不具合と、それに伴う大幅なデザインの変更を行いました。 それにより、実用に耐えうるソフトになってきたと感じています。

JComは、JavaとCOMの橋渡しですが、実際使おうとした場合、 インターフェースはかなり自分で作る必要が出てきます。 EXCELにしても、私が実装しているのはほんの一部で、それ以外の 機能は手付かずのままです。チョット凝った開発ではすぐに自分で作る 必要がでてくるでしょう。IDispatchインターフェースを介せば できないこともないですが、その場合COMの専門知識が必要に なってきます。かといって、私が「〜.jcom.excel8」パッケージや すべてのCOMのインターフェースを実装するわけにはいきません。 ユーザへのハードルは高いままです。

今考えているのが、任意のCOMのインターフェースについて、 Java側のクラスが自動生成できないか、ということです。 つまり、"Excel.Application"と入力すれば、JComのIDispachクラス から継承した _Application.java やその他のクラスのソースが自動生成するのです。 Javaの場合、クラスの情報の取得は java.lang.reflect がそれにあたるのですが、COMの 場合、ITypeInfoとか、ITypeLibなどがそれにあたります。

まず、手始めにC++ベースでITypeInfoやITypeLibを扱うプログラムを作ってみました。
Excel97の場合、表示するだけでかなりの量があります。 出力したものを見るだけで気が遠くなるような量です。(コードは下に:comdesc)

続いて、ITypeInfoやITypeLibをJavaから扱うためのクラスを作りました。 当然JNIを使っています。 すべての情報が必要とは思えないので、必要そうな情報だけサポートしています。 足らなかったら、またその時考えます。 JNIはなるべく必要最小限にしたいので、ITypeInfoやITypeLibの情報をJNIで 渡して、実際にソースを生成するのはJava側で行います。 その方があとあと楽ですし、出力されるソースのカスタマイズも容易になります。

さて、これでJavaからITypeInfoやITypeLibを扱う下地ができたので、 実際にJavaから扱ってみましょう。samplesの下のJComBuilder.javaというファイルを 見てください。指定されたProgIDからITypeInfoを取得し、ITypeLibを 取得しています。そして、それらの情報からJavaのソースを出力しようと しています。 しかし、これはまだ作りかけで、本来の目的の通りには動きません。 ゴールは目の前のようですが、なかなか大変です。 まだいくつかの壁を超えなければなりません。

COMにはよく見るDispatchやEnumだけではなく、COCLASSや、INTERFACEなど 様々な形があります。 それに配列はどうするのか?可変長引数はどうするのか? などの懸念事項もあります。 もし、COMに詳しい方がいましたら開発に協力して欲しいです。 実際に共同開発でなくても、サンプルを送ってもらったり、情報を送ってもらえれば助かります。

開発中のコード(最新順)

2000/07/23
  • IDispatch.invoke()のpublicのメソッドを作り忘れていたのを追加。m(_ _)m
  • TKIND_DISPATCHをかなり作り込んだ。大半のソースは自動生成できるようになった。
  • TKIND_COCLASSはとりあえず、最初のImplTypeから継承させるようにした。それに合わせて、ITypeInfoにImplTypeの情報も持たせるようにした。
  • JComBuilderからJComGeneratorに名前変更。深い意味はないです。
    jcom20000723.lzh(215,499byte)
    comdesc20000723.lzh(51,899byte)

    2000/07/15
  • JComBuilderからExcel固有のコードを省いた。例えば、"InternetExplorer.Application" と指定すれば、IEのCOMに対しても使える。
  • レジストリからTypeLibを取得するのはLoadRegTypeLib()。しかし、引数として GUID形式のLIBIDとバージョン番号を渡さなければならない。 でも、普通の人はLIBIDなんて知らない。ユーザの使いやすさを考えるなら、 EXEを指定して、そこから生成させる方がいいだろう。 いや、ProgIDからやる方法でいいんじゃないのかな。VBがそうだし。
    JComBuilder.java(9,650byte)

    2000/07/09
  • ITypeInfo._getVarDesc()を実装(作り忘れてた!)
  • JComBuilder.javaを手直し。Enum型はなんとなく行けた感じ???
  • IDispatchクラスにJNIの_invoke()と_getIDsOfNames()を追加。従来の_get(),_invoke()の とは別の口を用意。どちらでもCOMを利用可能
    jcom20000709.lzh (192,917byte)

    2000/07/07(七夕)
    jcom20000707.lzh (223,063byte)
    開発中のコードを公開



    現在の壁

  • COMのオブジェクトにはDispatch型やEnum型の他にも TKIND_INTERFACEやTKIND_COCLASSなどがある。 実際、EXCEL97でも使われている。
  • COCLASSって複数のインターフェースを持つもの?(かな) 多重継承みたいなものかな?でも、Javaには多重継承はないよ。どうする?
  • TKIND_INTERFACEはどうする?
  • Excelの場合、IFindなど、Officeのコンポーネントも返すメソッドがある。 自動生成したJavaファイルをコンパイルしようとすると、Officeのソースも 自動生成しておかなければならない。OfficeのProgIDって何?
  • invoke()するとき、いまはDISPPARAMSの引数名を使わない方しか対応していない。
  • とにかく、VARIANTとJava側のオブジェクトの対応が 完璧に取れていない。 すべてを完璧にとる必要はないと思うのだけれど、どれを取るべきかが わからない。分かる範囲内で対応しているけど、 今後、問題になるとすれば配列と参照。VT_PTRが未解決。
  • 可変長引数は???
  • 今はCOMしか考えていない。COM+になるとどう変わる?
  • C#を詳しく調べれば、COMの必要な部分と そうでない部分がわかるのではないだろうか?
  • 他のCOMについても早い時期に調べる必要があるだろう。 まだ、開発に必要な全体像が見切れていない。 同じ会社(MS)といえど、プロジェクトは別だ。Excelで通用することが、 WordやExchangeで通用するとは思えない。 ちなみに、Excel97とExcel2000は若干I/Fが変わっている。



    戻る