scriptletオブジェクト


WSH(Windows Script Host)におけるscriptletオブジェクト(最上位オブジェクト)について

はじめに

WSHにおける最上位オブジェクトとして「scriptlet」オブジェクトというモノが存在します。

これは「WScript」オブジェクトと同様に宣言をしなくても初めから存在している、WSHにおける組み込みオブジェクトなのですが、ほとんど、文書化されていない(少なくともいくつかの検索エンジンでは見つけられなかった)ようなので、当方で確認できた内容を記しておくことにしました。

HTML-DOMでは...

DHTML(Dynamic-HTML)におけるHTML-DOM(Document Object Model)では最上位オブジェクトとして「window」が存在します。(以下、ブラウザはIEを前提として話を続けます。)

他にも「document」等の組み込みオブジェクトはありますが、これは「window.document」というように「windowオブジェクトのdocumentプロパティ」として実装されているため最上位オブジェクトはwindowsオブジェクトということになります。

<script>として、JavascriptやVBscriptで関数/サブルーチン(以下、単純にメソッドと表現します)を作成すると、windowオブジェクトのメソッドという形で追加されます。

例)function func01(){...}という関数を作成した場合、window.func01()というメソッドとして追加されます。

このメソッドはwindow.func01()という形でも呼ぶことが出来ますが、Jscript(Javascript)、VBscriptでは「window」の記述を省略できるため、func01()という記述で関数を呼ぶことが出来ます。

WSHでは...

で、WSHに話が戻りますが、WSHでも「DHTMLにおけるwindow」同様の「scriptlet」オブジェクトというものが、存在します。

JscriptやVBscriptでメソッドを作成すると、scriptletオブジェクトのメソッドという形で追加されます。

例)function func01(){...}という関数を作成した場合、scriptlet.func01()というメソッドとして追加されます。

また、一般的に最上位と思われている「WScript」オブジェクトもscriptlet.WScriptというように「scriptletオブジェクトのWScriptプロパティ」という形で実装されています。

WSH5.6において言語に依存しないメソッドである「getResource()」や「createComponent()」メソッドも、実は「scriptlet.getResource()」「scriptlet.createComponent()」という形で実装されているのです。

Jscript、VBscriptでは「scriptlet」の記述を省略できるため、「WScript」「getResource()」「createComponent()」といきなり記述することができるのです。

scriptletオブジェクト(本題)

で、ここで本題。
「省略できるのならば、気にする必要ないじゃん」ということになるのですが、「WSH対応の言語」=「scriptletの記述が省略できる言語」ではないのです。

JscriptやVBscriptが記述を省略できるように実装(設計)されているだけなのです。

省略できない例としてRuby(ActiveScriptRuby=WSHで使えるRuby言語。以下、単にRubyと記述します)があります。
(以下はRuby1.6.7の時点での機能としての説明です。)

WSHには、複数の言語で記述し、他言語で作成したメソッドを呼ぶことが出来るという、魅力的な機能があります。

RubyはRubyにて宣言した関数(メソッド)は当然メソッド名だけで呼べるのですが、他言語にて作成したメソッドは、その関数名を記述しただけでは呼べません。(定義されていないメソッド名としてエラーになります。)

例)
<package>
<job>
<script language="VBscript">
  function VBfunc
    VBfunc = "return from VBS"
  end function
<script>
<script language="Jscript">
  function Jfunc{
    retuen "return from JS";
  }
<script>
<script language="Rubyscript">
  def Rfunc
    "return from RS"
  end

  @WScript.Echo(Rfunc)  #(1)表示される
  @WScript.Echo(VBfunc) #(2)エラー
  @WScript.Echo(Jfunc)  #(3)エラー
<script>
</job>
</package>
というスクリプトで(1)のRuby→Rubyの呼び出しのみ表示。(2)(3)は未定義のメソッドとしてエラー。

Rubyではscriptletオブジェクトのメソッドとして呼び出すことが出来るのです。

scriptletオブジェクトはRubyでは言語仕様より「Scriptlet(頭文字大文字=定数)」または「@scriptlet(@を付ける=インスタンス変数)」という記述でアクセスできます。

上記例の表示部分を

@WScript.Echo(Rfunc)
@WScript.Echo(@scriptlet.VBfunc)
@WScript.Echo(@scriptlet.Jfunc(nil))

と記述することで、正しく呼び出すことが出来るのです。
(Jfunc(nul)のnilは引数を与えないとJscriptのfunctionオブジェクトそのものが返ってくるというJscript側の言語仕様もからむための記述です。)

ちなみに、VBscript、Jscriptでは単に
Rfunc()
VBfunc();
と言う記述でも呼べますが
scriptlet.Rfunc()
scriptlet.VBfunc();
のように明示的にscriptletを記述しても他言語のメソッドを呼び出すことが出来ます。

経緯

ちなみに、scriptletオブジェクトの存在を知ったのは、

「Rubyから他言語が呼べない」で悩む。
  ↓
ActiveScriptRubyの作者殿のページにたどり着く。
  ↓
その「過去の開発履歴」のページに「wscにおけるscriptletオブジェクト」について記載されていた。

ということから知って調べはじめた、と言う経緯があります。

戻る