VBScriptラッパー修正
2007-06-04


意味不明メソッドとちょっとしたバグ修正

以前のエントリに掲載した、JScriptからVBSを実行するためのVBSラッパーだが、よくよく見直してみるとちょっと具合が悪かった。

まずresetメソッドを実装していたのだが、自分で見直しても用途が不明な上に、たぶん実装時に意図していた動作は行わないんじゃなかろうかということに気づいた。なのでこのメソッドは廃止する。

それから、追加するVBSのプロシージャ/関数で引数を取らないものを登録したときに、ラッパーから実行するとエラーになっていたので、VBSプロシージャ/関数の引数の数をチェックするようにした。

修正済みコード

以下のようになる。組み込み方/使い方は以前のエントリを参照のこと。

// VBScript実行エンジンラッパークラス
var VBScript = Class.create();
VBScript.prototype = {
        initialize : function() {
                this._vbe = new ActiveXObject("ScriptControl");
                this._vbe.Language = "VBScript";
        },
        addFunction : function(code) {
                this._vbe.AddCode( code );
                this._copyMembers();
        },
        _copyMembers : function() {
                var self = this;
                var vbe = this._vbe;
                
                new Enumerator( vbe.Procedures ).each( function(proc) {
                        self[ proc.Name ] = function() {
                                if( proc.NumArgs == 0 ) {
                                        return vbe.Run( proc.Name );
                                }
                                var args = arguments;
                                var p = $R( 0, proc.NumArgs, true ).map( function(i) {
                                        return args[i];
                                } );
                                return eval( "vbe.Run( \"{0}\", {1} )".format(
                                        proc.Name,
                                        p.map( function(obj, i) { return "p[{0}]".format( i ); } ).join(", ")
                                ) );
                        }.bind( self );
                } );
        }
}

便利なVBSコード

おまけになるが、JScript単体では困難で、登録しておくと便利なVBSコードスニペットをいくつか書いておく。

前提で、VBSラッパーをvbsという名前でnewしておこう。

var vbs = new VBScript();

まずはInputBoxラッパー。ブラウザ上のpromptっぽい使い方をするので「prompt」として登録する。

vbs.addFunction( [
        "Function prompt(msg, title)",
        " prompt = InputBox(msg, title)",
        "End Function"
].join("\r\n") );
引数「msg」はダイアログに表示されるメッセージ、titleはダイアログのタイトルになる。InputBoxはボタンやアイコンの指定なんかもできるのだが、そこまで複雑にしなくてもいいやという投げやりな実装である。

次に何度か取り上げているが、TypeName関数のラッパー。

vbs.addFunction( [
        "Function getTypeName(obj)",
        " getTypeName = TypeName( obj )",
        "End Function"
].join("\r\n") );
objの型名を返してくれる。typeof演算子と違い、COMオブジェクトの型を調べられる。

最後に、役に立つケースは極めてまれだが、VBSのNothingを得るgetNothingを実装する。詳細はこちらのサイトが非常に詳しいが、VBSのNothingはnullでもundefinedでもない。COMを扱っているとまれにNothingが必要になるので、そんな場合に役立つかと。

vbs.addFunction([
        "Function getNothing",
        " Set getNothing = Nothing",
        "End Function"
].join("\r\n") );
[JavaScript]
[WSH]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット