XREA.COM Logo XREA.COM Ad

Sleipnir2スレ

58l ★:2007/06/05(火) 13:46:30 ID:???
SleipnirScriptの中でsleipnir.Database.Open()したデータベースは、SleipnirScriptが終了しても使える
ぷよラボ(http://www.google.co.jp/notebook/public/10297603972126706440/BDRO8IgoQwtm4pKQi)のどこだったかで知った。

「_window.sleipnir=sleipnir」というようにして他所のオブジェクトにSleipnirScriptの組み込みオブジェクトを追加してやっても、SleipnirScriptが一旦終了してしまうと使えなくなってしまう。
確か、sleipnir.Databaseを追加してやってもダメだった気がする。
スクリプト実行機能側で、実行終了後に毎回オブジェクトを解放しているのだろう。
しかし、「_window.mydatabase=sleipnir.Database.Open('myDatabase')」とした場合、SleipnirScriptが終了していても使える。
メソッドで動的に生成したオブジェクトまでは、いちいち解放してないのだろう。
これで、ブラウザ上のスクリプトなどからもSleipnirのデータベース機能が利用できる。
データベースさえ使えるようになれば、残りの機能はAPIなどで補える。
実行中にSleipnirがハングアップする組み込みスクリプトの問題を回避しつつ、ほぼ全ての機能を利用できそうだ。

ブラウザのJavaScriptは、Sleipnirのプロセス内で実行されているので、オブジェクトをそのまま使えるのは分からなくもない。
では、wscript.exeなどの別プロセスではどうだろうか。以下のようにして試してみた。

try{
var api=sleipnir.API;
api.GetWindowObject(api.GetDocumentID(api.ActiveIndex)).sleipnir_db=sleipnir.Database.Open("ScrapBook");
(new ActiveXObject("WScript.Shell")).Run('cscript "'+sleipnir.ScriptFullName+'"',0);
}catch(e){
basedir=WScript.ScriptFullName.replace(/(\\[^\\]+){3}$/,"\\ScrapBook\\");
eval((new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(basedir+"lib\\Std.js").ReadAll());

api=new ActiveXObject('Sleipnir.API');
win=api.GetWindowObject(api.GetDocumentID(api.ActiveIndex));
WScript.Sleep(1000);
res=win.sleipnir_db.Query('SELECT count(ID) FROM Pages');

win.alert(res.Current().At(0));


obj=(new ActiveXObject("WScript.Shell")).Exec('ping google.com');
win.alert(obj.StdOut.ReadAll());
}

普通に使えているようである。
これで、WScriptオブジェクトを使ったり、非表示のcscript.exeから起動した非表示のコンソールプログラムの標準入力に書き込んだりすることも可能になりそうだ。(標準出力の方はプロセスが終了するまで読み出せない腐れ仕様なので対策が必要だが)

また、プロセス間で共有できるのだから、勝手に作ったスクリプトコントロールでも利用できるに違いない。
・Webページのイベントやタイマーに割り当てられて
・JavaScript無効でも動作して
・Sleipnirのデータベース機能を利用でき
・実行中にSleipnirがハングアップしたりせず
・クロスドメイン制限のないXMLHTTPRequestやADODB.Streamなども使え
・外部プロセスを呼び出したりしない
というようなスクリプト実行も可能だろう。

以前頑張って作ったsqlite3.exeを使ったデータベース読み書きモジュールが無駄になってしまったが、まあいいか。
57KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08