2013年10月27日日曜日

OLE はひろいーな おおきーなー

OLE に関わって初めて知ったけど OLE の仕様って巨大なんだなぁ.名前付き引数とかイベント通知とか初めて知ったけど,まぁ使わないし実装しなくていいや,というわけで,Excel は動いたので本命の XMLHttpRequest を動かすことにする.といってもほとんどのメソッド・プロパティはそのままで動くので,新規に実装すべきは onreadystatechange の callback くらい.

OLE サーバ側から JavaScript 関数を呼ぶってどうやるんだ? と思っていたら,答えはほとんどここに載っていた.要は onreadystatechange プロパティには IDispatch を登録して,XMLHttpRequest からコールバックされるときは Dispatch ID = 0 で Invoke されるみたい.Invoke されたら改めて JavaScript の Function Call をすれば良いと.

でやってみたら,なんか中途半端に動かねぇ(゜ーÅ)ほろり
相手先サーバ (Google) から「405 The requested method -1 is inappropriate...」ってレスポンスが返ってきた.-1 ってなんだよwww 普通ここ POST とか GET でしょ? と悩むこと 1時間,スクリプトの open メソッドを眺めていたら,
xhr.open( "GET", url, true );
true ってもしかして -1 (0xFFFFFFFF) なんじゃね? とふと気づいて
xhr.open( true, url, "GET" );
ってやったら動いた(;´д⊂)Invoke 時の引数の順番が逆になってた…

という訳で,Google Maps のジオコーディングが無事動いた.これがやりたかっただけなのにすげー回り道したwww

2013年10月25日金曜日

拡張性に魂を縛られた人々(2)

Google V8 に ActiveXObject サポートを追加する,の続き.とりあえず
ExcelSheet.ActiveSheet.Cells( 1, 1 ).Value = "hoge";
を通すことを目標にがんばる.

まず,Cells が関数じゃねぇというエラーについて.
Cells は GetFuncDesc() した結果,INVOKE_FUNC じゃなくて INVOKE_PROPERTYGET が返ってきている.つまり関数じゃなくて単なるプロパティとして v8 は扱うので,Cells() が function じゃねぇという指摘はごもっとも.

じゃ実際に Cells を Invoke した時に何が返ってきているかというと VT_DISPATCH が返ってきていた.つまり「ExcelSheet.ActiveSheet.Cells」ここまでは,ActiveXObject オブジェクトということになる.

ここで v8 に SetCallAsFunctionHandler というのがあったなぁとピンときた.
v8.h のコメントを読んでみると,「オブジェクトをファンクションコールのように呼んだ時に呼ばれるハンドラ関数を登録する」とのことで,ズバリそのものだった.このハンドラに,Cells の Invoke で得た ActiveXObject オブジェクト≒IDispatch に Invoke するハンドラを登録すれば良い (ハンドラ自体は普通の ActiveXObject オブジェクト のメンバ function を Invoke する関数と全く同じ).

問題は Cells の IDispatch のなんというメソッドを呼べばよいのか?
ここからはググっても明確なドキュメントが得られなかったので自分の推測になるが,おそらく _Default というプロパティが DispatchID 0 で登録されている決まりになっているらしく,_Default か DispatchID 0 かどちらかで Invoke するのが正解のようだ.

という訳で↓が動いたヽ(´ー`)ノ
var ExcelSheet = new ActiveXObject("Excel.Sheet");
ExcelSheet.Application.Visible = true;
ExcelSheet.ActiveSheet.Cells( 1, 1 ).Value = "This is column A, row 1";
ExcelSheet.SaveAs("TEST.XLS");
ExcelSheet.Application.Quit();

Excel はそこそこにして,お次は本命の XMLHttpRequest に挑戦する.

2013年10月22日火曜日

拡張性に魂を縛られた人々

Google V8 に ActiveXObject サポートを組み込んでみるテスト.
これができたら,VSD for GPS の拡張性が飛躍的に上がって,例えば Excel 起動してセルに値書き込んで保存とか JavaScript で制御できる.

そんな機能いらねぇしwwww

まぁログリーダで任意のプログラム起動できるし,XMLHttpRequest が動いたら GeoCoding とかできるかもしれんし,そこら辺は使い道あるんじゃなかろうか.
まぁぶっちゃけそこに山があるから登る的な感じで拡張性を広げたかっただけ.

という訳で実装開始.
とりあえず C++ オブジェクトの IDispatch をラップする JavaScript オブジェクトの ActiveXObject を設計.
普通は V8 の SetNamedPropertyHandler で,メソッド・プロパティが参照されるたびに IDispatch::GetIDsOfNames() して IDispatch::Invoke() するのが素直なんだろうけど,これだと毎回名前→ID 変換テーブルを舐める気がして,V8 のJIT を生かせないような気がしたので,new ActiveXObject された時に全メソッド・プロパティをオブジェクトに登録することにした.これだと for( hoge in obj ) とかも問題なく動くので結果的に楽.

で,Excel を起動することろまではたどり着いたが,
ExcelSheet.ActiveSheet.Cells( 1, 1 ).Value = "hoge";
で Cells は関数じゃねぇ! って怒られた.先は長い…

2013年10月8日火曜日

雁ヶ原

ozzinger さん & Nさんと久々に雁ヶ原に行ってきた.
今回はたいした車載を撮れなかったので写真中心で.

←本日集まったメンバー.
そしてその他には誰もいないw
目的の半分はこれを見に来たと言っても過言ではない.
ozzinger 号の全塗装.
ソリッドな黄緑ではなくメタリックが入っていたので,太陽光の下では非常に鮮やかな緑だった.
そしてバッタも緑を求め寄ってくるw
昼飯のソースカツ丼.勝山の名物らしい.結構うまかった.
ozzinger さんに撮ってもらったベストショット.
フルカウンターを当てているので多分スピン直前と思われますwww
が写真にするとそれなりにカコイイ!!

この日は頑張って 16:50 までは遊んだw