2005年04月13日

TJS2からCOMを使う

FlashでCOM関連を調べていて、TJS2からCOMを呼べたら楽しいかもと思った。
TJS2からCOMが使えるのなら、VideoOverleyのFlash実装がTJSで書けるはず。
それをやることにあんまり意味はないのだが、Excelでグラフをぐりぐり回すよりは用途あるかも。
他に使えそうなことと言ったら、IEを吉里吉里の中に埋め込み表示することだろうか?
まあ、なんだかんだで使いではあるかもしれない。
でも、COMが使えるPerlでやったことがあることといったら、Excelのファイルを読み込んで、ソースコードを生成させることぐらい。それはそれでかなり便利なのだが、TJS向きではない気がする。
ま、とにかく楽しそうなので、少し調べて、コードを書いてみることにした。

実際の実装方法は、Win32OLE 製作過程の雑記という、OLEをRubyへ実装する過程について書かれたページを見てみると、面倒そうではあるが、そんなに大変ではなさそう。
とりあえず、CoCreateInstance 関数をプラグインで登録し、そいつがクラスのインスタンスを返すような実装でいいかな。
でも、その返すインスタンスってiTJSDispatch2 を継承したクラスのインスタンスでいいんだろうか? なんとなくそんな感じだが。
後、メソッドのパラメタにあるobjthisが、実行しているクラスのコンテキストなのか?
つまり、objthis->m_pDispatch->invoke() ってな感じになるのだろうか?
とりあえずは、クラスとインスタンスの関係と、iTJSDispatch2のメソッドでどのように振舞えばよいのかよくわからないと言うのを解決しないとまずそうだな。
作りつつ、聞いてみるか。

それはさておき、COMよりも .NET Framework のクラスライブラリが使えないかなぁ? とずっと思っていたりする。(COMが使えれば何とかなるのかな?)
後、Pythonとか、ImageMagick、SQLiteが使えるといいんだけど。
TJSQLiteとかかなりやってみたい。
単にその名前が使いたいと言うのがかなり大きいんだけど、レコード状のデータを扱う場合、RDBMSが使えると楽だと思う。
たとえば、RPGでアイテムや敵キャラなどはRDBに入れて使うといった用途に向いてるだろう。

投稿者 Takenori : 00:09 | コメント (2) | トラックバック

2005年04月14日

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 : 01:05 | コメント (2) | トラックバック

2005年04月18日

しばらく待っていれば出来る?

Web系の開発に追われていたら、近い物が出来ていることをW.Dee氏に教えていただく。
2005年4月17日の電波状況
IEが使えるみたい。
ここまで出来ているのなら、COMももうちょっとのような・・・
もしかして、もう少しすればCOMプラグインも出来る?
これは待っていた方が良いかも。

LAMPでアニメ付きXファイルを読めるようにする方の開発を優先しよう。

投稿者 Takenori : 03:32 | トラックバック

2005年04月19日

相互依存でデッドロック

2005年4月18日の電波状況
ありゃりゃ。

気が向いたら作ることにするか。
.NETの内部には興味があるし。
でも、あんまり興味のないDirectShowにどんどん詳しくなっていくのはいかがなものか…

投稿者 Takenori : 01:01 | トラックバック

2005年05月29日

いつの間にか出来てる

2005年5月4日の電波状況
出来てたみたい。
良かった、良かった。

投稿者 Takenori : 22:05 | トラックバック

 
Total : Today : Yesterday :