VBScriptラッパー修正2007年06月04日 02時58分34秒

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

以前のエントリに掲載した、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") );

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/06/04/1553718/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。