PHPScriptをOrthoclaseで使えるようにしたい

PHPScriptをどうしても動かしたいので,もっとがんばってみた.
デバッグデータベースを置いてちょこちょこデバッグしてみると,案の定、GlobalInterfaceTableをScriptSiteのスレッド間共有に使っていて死んでいた.RubyScriptと同じ原因だ・・・
ここで詰んでいるわけにも行かないので,ここで禁断の魔法,ole32.dllメモリイメージのエクスポートアドレステーブルを改ざんする仕組みを導入した.システムDLL系のメモリイメージは書き換えるまでプロセス間で共有されるから,出来るだけ書き換え避けたかったんだけどなぁ・・・
CoCreateInstanceのエントリを書き換えて,こちらの関数を呼び出すよう差し向けることで,GlobalInterfaceTableをラッパークラスで包む手段を手に入れた.
ラッパークラスにriid = IID_IActiveScriptSiteで登録が来たら,こちら側が用意したTableにマーシャリングせずに突っ込んでおき,取得で失敗したときにそのテーブルを引いて渡す.こうすることで,ScriptSiteの共有失敗という悪夢は消える.
ここまでで,ようやく起動するところまではこぎ着けた.しかしこのスクリプトエンジン,実装が手抜きなのか知らないけどeventに接続してくれない.ConnectObjectで繋げてみると,次はScriptDispatchはエンジンスレッドからしか呼び出せないと抜かす.さすがZend Engine・・・
そこで,ConnectObjectが呼び出されたとき,エンジンスレッドにイベントメソッド呼び出し用のウィンドウを注入しておき,呼び出し時にメッセージパッシングするという仕組みを導入した.よくCOMオブジェクトとかが苦し紛れにやってそうな奴.本当は引数とかオブジェクトをマーシャリング・アンマーシャリングしなければいらないけど,失敗することは目に見えているし,無理やり生データ送信にしておいた.
これで上手くいくと思いきや,同期メッセージディスパッチしてるから呼び出せませんとか言うエラーが.どうやら,SendMessageを使っているのが原因として起きるエラーで対策はPostMessageを使うことらしい.こちらとしては同期じゃないと困るので,PostMessage + MsgWaitForMultipleObjectsExでイベントオブジェクト・(Zend Engineタイムアウトウィンドウの)メッセージ待ち + メッセージループという訳の分からない回避策を導入した.これでようやく,スクリプトを上手く呼び出せるようになった.
しかし,LimeChatグローバルメンバへのアクセスは$eventオブジェクトへのアクセスじゃないといけなかったり(フラグでグローバルメンバ指定してるのに!),CONNECTEDステートにしてるのにConnectObjectで接続しないといけなかったりするのを見ると,ちゃんと実装しているのか疑いたくなる・・・