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が変わっている。
戻る