著作一覧 |
さて、動くようになったかと思ったが、そうではなかった。
ので、直した。ダウンロードのページ
以下のようなスクリプトが動かないとのことだった。
<script language="RubyScript"> def foo alert('foo') end </script> <script language="JScript"> function bar() { foo(); } </script>
といった、言語間のインターオペラビリティでエラーとなる。
ホストから見れば、Rubyのfooも、JScriptのbarも、どちらもwindowオブジェクトのグローバル関数だ。したがって、windowのIDispatch*で自分が知っている関数について(この場合はfoo)は、自分でwindowのIDispatch*からJScriptが呼べるようにしてやらなければならない。
つまり、windowのIDispatch*を使ってデリゲートを実装する必要がある。
が、スレッド間のマーシャリングが厄介で、と最初考えたが、良く考えたら、JScriptやホストがRubyのスレッド内から呼び出すはずはなかった。したがって、GetScriptDispatchに返すwindowのIDispatch*をラップしてやり、そこのGetDispIdやInvokeExで呼び出しを切り替えれば良いことになる。
なお、MSDNには優先順位は書いていないので、ホスト優先とすることにした。
つまり、
def alert(x) @window.alert(x) end
は、一見するとうまく動きそうで、かつ、Rubyスクリプト内から呼ぶ分には、正しく動くが、仮にJScriptから呼び出そうとすると、ASRは、windowのalertを先に見つけ、windowのIDispatch*へ委譲してしまうので、Ruby側のalertは呼ばれない。名前のバッティングはしてはいけない。
おもしろかった。
ジェズイットを見習え |
動作確認できました<br>対応して頂き、本当にありがとうございました
それは良かったです。2chはほとんど読まないので、もしバグを見つけたら、最新の日記にでもツッコミ入れてください。