« TJS2からCOMを使う | メイン | しばらく待っていれば出来る? »

2005年04月14日

吉里吉里 COM/.NET拡張:: iTJSDispatch2 を実装していく

    

オブジェクトから iTJSNativeInstance を取り出そうとするときに、クラスに対応した ID が必要になるだけなので、それがいらないならば登録の必要はないそうだ。
ならやっぱり、iTJSDispatch2を継承し、COMのIDispatchへのポインタをメンバに持ち、関数呼び出しやプロパティの取得/設定をIDispatchへの呼び出しに変換するクラスを作り、TJSへ登録した関数かクラスでそのクラスのインスタンスを返すようにすれば良さそう。

とりあえず、AddRef と Release、FuncCall だけを実装してみることにする。
AddRef と Releaseは単にメンバのIDispatchの同名のメソッドを呼ぶだけ。
FuncCall は少し面倒と言うか、これが出来ればほとんど出来たような物。

とりあえず、objthisは無視することにした。
DISPIDをhintに入れれば、GetIDsOfNames を毎回コールする必要がなくなるが、それが初回呼び出しかどうかの判別はどうやるのだろう?
よくわからないので、hintは使わずにGetIDsOfNames を毎回コールすることにした。
IDispatch::GetIDsOfNamesの引き数、LCID lcidって何? リファレンスのサンプルのLOCALE_SYSTEM_DEFAULT をそのまま渡すことにした。
サンプルの実装コードでは思いっきり無視しているので別にいいかと思ったけど、一応調べてみると、ロケール ID (LCID)ってことらしい。
で、デフォルトとして次の物が定義されているようだ。
LOCALE_SYSTEM_DEFAULT, which identifies the system default locale.
LOCALE_USER_DEFAULT, which identifies the locale of the current user.
やっぱり、LOCALE_SYSTEM_DEFAULT を渡しておけば良さそう。LOCALE_USER_DEFAULT の方がいい気がしないでもないけど、サンプルに従うことにする。

IDispatch::GetIDsOfNamesでDISPIDをもらったら、次はパラメタの変換。
VARIANTの変換は直に書くと面倒なので、_variant_t と_bstr_tにだいたい任せるようにする。
具体的には、tTJSVariant::Type で型を見てから、キャストして_variant_tのコンストラクタに渡し、_variant_t::Detach でVARIANT に戻すように。
でも、tvtOctet はどうしよう? char*でいいかな? また、ソース見てから考えよう。
tvtObjectは、iTJSDispatch2 を継承したCOM用のクラスとみなす・・・のはまずいか。
たぶん、COMのイベント応答時に、TJSの関数かクラスを渡すことになるはずなので、そのようにするとまずそうだけど、とりあえず、既定動作はそのようにしておくことにする。
ここはイベントの処理を組み込む時にまた考えよう。

検索で見つかった役立ちそうなページをメモ
IEコンポーネントの使い方
COMからのイベントを捕まえる方法
BSTR 覚え書き



投稿者 Takenori : 2005年04月14日 01:05



コメント

ごうさんが面白い物を作っています。

■2005年4月17日の電波状況
http://www.denpa.org/~go/denpa/200504/from11.html

投稿者 W.Dee : 2005年04月18日 00:11

W.Deeさん、こんばんは。

これは!?
もう少しでCOMも実装できそうなのに…

投稿者 Takenori : 2005年04月18日 03:22


comments powered by Disqus
Total : Today : Yesterday : なかのひと