XREA.COM Logo XREA.COM Ad

Sleipnir2スレ

60l ★:2007/06/09(土) 11:51:39 ID:???
sleipnirオブジェクトもSleipnirScriptが終了しても普通に使える
らしい(http://d.hatena.ne.jp/Puyo2/20070608/p1

以下のスクリプトをUserActionで試してみたところ

code='('+(function(){
window.mainfunc=function(){
sleipnir.Echo('main');
}
window.attachEvent('onunload',function(){
sleipnir.Echo('unload');
});
window.setTimeout('window.mainfunc()',1000);
})+')();';
sc=new ActiveXObject('MSScriptControl.ScriptControl.1');
(_window.__ScriptControls__||(_window.__ScriptControls__=new Array)).push(sc);
with(sc){
Language='JScript';
AddObject('window',_window);
AddObject('document',_document);
AddObject('sleipnir',sleipnir);
Eval(code);
}
sleipnir.Echo('Exit from SleipnirScript');

確かにsetTimeoutでもイベントでも普通に動作した。
なんで以前試したときうまく行かなかったのか謎だが、とりあえず今は動いているから構うまい。

このようにしてwindowにスクリプトコントロールを付けていると、ページに仕込まれたJavaScriptからスクリプトコントロールのEvalで好き放題やられる恐れがある。
ページのJavaScriptをONにすることなんて滅多にないので別にどうでもいいが、何とか対策をしたいところ。

Eval('var sc=window.__ScriptControls__.pop();window.attachEvent("onunload",function(){sc=null;});'+code);

という風に改変してやれば、Evalされるコードとそこで作られた関数からしか見えない変数になり、ページ上のJavaScriptからは参照できなくなるような気がする。
関数がwindowのイベントにアタッチされて生存している間は、そこから参照可能なオブジェクトも生き延びるはず。
試してみたところ、動作しているような気がする。

スクリプトコントロールが正しく解放されているのかは、

window.mainfunc=function(){
ex=(new ActiveXObject("WScript.Shell")).Exec('cmd');
}

としてやれば試せるはず。
こうして生成されたWshScriptExecオブジェクトは、解放されるときに子プロセスを終了する。
実行してみたところ、確かに1秒後にコマンドプロンプトが表示され、ウィンドが閉じられるのに連動して終了した。
なお、sc=nullの部分を削除したら、正しく解放されなくなった。
どこから参照されているのかよく分からんが、恐ろしや。

そんなわけで、とりあえずwindowに安全にスクリプトコントロールを付加してイベントなどからsleipnirオブジェクトの全機能を利用することは出来そうである。
しかし、この方法では、ウィンドウが閉じられたときにスクリプトコントロールが使えなくなってしまう気がする。
非表示で起動したcscript.exeに受け渡すことは出来るだろうか。
57KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08