トップ «前の日記(2009-02-16) 最新 次の日記(2009-02-18)» 編集

日々の破片

著作一覧

2009-02-17

_ ASRの修正続き

2/15の続き

さて、動くようになったかと思ったが、そうではなかった。

ので、直した。ダウンロードのページ

以下のようなスクリプトが動かないとのことだった。

<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は呼ばれない。名前のバッティングはしてはいけない。

おもしろかった。

本日のツッコミ(全2件) [ツッコミを入れる]
_ 563 (2009-02-17 01:51)

動作確認できました<br>対応して頂き、本当にありがとうございました

_ arton (2009-02-17 02:00)

それは良かったです。2chはほとんど読まないので、もしバグを見つけたら、最新の日記にでもツッコミ入れてください。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え