Andrew Clinick
Microsoft Corporation
September 13, 1999
日本語版最終更新日 2000 年 1 月 27 日
このコラムは、もともと MSDN Online Voices のコラム "Scripting Clinic" に掲載されたものです。
私がこのコラムを開始したとき (そのとき私は、私の時間がそれほど取られないように、不定期連載になるだろうと言いましたが、それは正解でした)、スクリプトレットが "現実" の人々が使えるコンポーネント テクノロジをどのように提供するかということについて記事を書きました。今月は、その記事の続きとして、Windows Script Components の新しい 1.1 バージョンを使用して、うまくすると 1 つのコンポーネントを書くだけで、クライアントまたはサーバー上の両方で使用できるコンポーネントを書く方法を述べます。
1 つのテクノロジはいくつの名前を持つことができるか?
以前から Windows Script テクノロジを追いかけてきた人は、Windows Script Components が正当な持ち分以上に様々な多くの名前を持っていたことに気づくでしょう。確か、このテクノロジは以前は スクリプトレットと呼ばれていたはずでは?と思う方もいると思います。 スクリプトで書かれた最初のコンポーネント群は、スクリプトレットという魅力的な名前で Internet Explorer 4.0 とともにリリースされました。スクリプトレット は、Internet Explorer 用の DHTML コードをコンポーネント化する手段を提供しましたが、クライアント上でしか動作しないという制約がありました。これは、サーバー上で書かれるスクリプトの量を考えると、まだまだ力不足であることがわかりました。そこで、スクリプト チームは、Active Server Pages (ASP) テクノロジと Microsoft Transaction Server (MTS) トランザクションで動作する軽量なランタイム スクリプトを提供する「サーバー スクリプトレット」に取り組み始めました。サーバー スクリプトレットの開発を進めるにつれて、それがサーバーだけでなくクライアント上でも役に立つことが、ますますよく理解できました。しかし、このような認識は困惑をもたらしました。そして、我々はスクリプト コンポーネント ランタイムを開発していましたが、スクリプトレットという名前は手放すには惜しいキュートな名前なので、既存のスクリプトレットの名前を「DHTML スクリプトレット」に変更することにしました。これで、新しいテクノロジをスクリプトレットと呼ぶことができるようになりました。ユーザーは、名前が変更されたことと、どちらもスクリプトを使用するという点を除けば、それらのテクノロジに共通点が少ないことを理解してくれるだろうと考えました。
1 月のある雨降りの朝、現実がスクリプティング チームに衝撃を与えました。魅力的な製品名を使用するために歴史を書き直すことは、カスタマを喜ばせない!ということに気が付いたのです。 我々は出発点に戻り、我々は Windows 用のスクリプト テクノロジを作っているのだから、Windows Script と呼ばない手はないではないか、ということになりました。そうすれば、Windows Script Engines、Windows Script Host、Windows Script Interfaces、Windows Script Debugger、そして最後に、Windows Script Components という名前を使うことができます。こうして、Windows Script が誕生しました。
サーバーまたはクライアント上で実行するコンポーネントを書く
Windows Script Components の利点の 1 つは、ランタイム ライブラリがクライアント (Internet Explorer 5、Windows Script Host、または任意の COM アプリケーション) でも、サーバー (Internet Information Server (IIS)、MTS など)でも、うまく機能するということです。バージョン 1.0 では、このように利用できるコンポーネントの作成は容易ではありませんでした。DHTML ビヘイビアと ASP ハンドラの両方を含めると、エラーになりました。我々がこの見落としに気づいたのは、バージョン 1.0 の製品サイクルがかなり進んでいた段階だったので、バージョン 1.1 (現時点ではベータ) で修正することにしました。Windows Script Host 5.1
を通して Windows Script Component 1.1 をダウンロードすることができます。
Windows Script Component (WSC) バージョン 1.1 では、DHTML ビヘイビアと ASP 機能の両方の <implements> 要素を同じ WSC に含めることができます。ランタイムは、どちらを実行できるかを調べて、必要なハンドラだけをロードします。この新しい機能は、1 つのコンポーネントだけを書けばよいことを意味します。そのコンポーネントが実行環境 (クライアントまたはサーバー) に順応します。これを示すために、私は 1 つのプロパティ、メッセージ、および 1 つのメソッド display を持つ単純な WSC を作成しました。この WSC は、Internet Explorer と ASP の両方のテクノロジを利用するために実装されたビヘイビアと ASP ハンドラの両方を持っています。
<?xml version="1.0"?>
<component>
<?component error="true" debug="true"?>
<public>
<property name="message">
<get/>
<put/>
</property>
<method name="display">
</method>
</public>
<implements type="Behavior" id="Behavior"/>
<implements type="ASP" id="ASP"/>
<script language="VBScript">
<![CDATA[
dim message
function get_message()
get_message = message
end function
function put_message(newValue)
message = newValue
end function
function display()
' Check to see if the behavior handler is loaded
if isobject(Behavior) then
element.innerHTML=message
' Check to see if the ASP handler is loaded
elseif isobject(ASP) then
response.write message
else
' ASP and Behavior not loaded so default to something that
' will work in any application aka msgbox
msgbox message
end if
end function
]]>
</script>
</component>
上記のコンポーネントの鍵は、display メソッドにあります。このメソッドが呼び出されると、コンポーネントが作成されている場所を調べます。ビヘイビア ハンドラがロードされている場合は、isobject による問い合わせに対して true を返します。したがって、コンポーネントが Internet Explorer によってロードされるときには、innerHTML プロパティの値を message プロパティの値に設定します。ASP ハンドラがロードされている場合は、コンポーネントは ASP で実行するので、response.write を使用します。どちらでもない場合は、コンポーネントは未知のクライアントに実行しているので、何か有用なものにデフォルト設定します。
コンポーネントを使用する
simple.wsc の使用は、比較的単純です。コンポーネントのインスタンスを作成して、message プロパティを設定し、display メソッドを呼び出すだけです。コツは、コンポーネントをインスタンス化する方法です。この記事では、Internet Explorer、ASP、および Windows Script Host について述べます (これは、WSC をインスタンス化する一般的なメカニズムです。Visual Basic®、Office など、任意の COM アプリケーションに適用することができます)。
Internet Explorer
Internet Explorer 5 では、WSC は新しい DHTML ビヘイビア機能を介して使用されます。DHTML ビヘイビアは、ページ上の特定の機能または動作 (ビヘイビア) をカプセル化する単純で軽量なコンポーネントです。ページ上の標準的な HTML 要素に適用されると、ビヘイビアはその要素のデフォルトの動作を拡張します。スクリプト コンポーネントを動作させるための最も単純な方法は、ページのスタイル シートに新しいクラスを作成して、ビヘイビア属性を WSC の URL に設定し、HTML 要素のクラスを新しいクラスに設定し、その HTML 要素に対応する WSC のプロパティとメソッドを設定することです。
この記事のために私が作成した simple.htm を以下に示します。このページは、前述の simple.wsc を参照して、それをページのスタイル シートの simple クラスに関連付けます。<DIV> は、スタイルとして simple クラスを使用して、WSC のインスタンスを作成します。WSC がロードされると、<DIV> は WSC のメソッドとプロパティを「継承」します。ページがロードされるときには、<DIV> の message プロパティを設定して、display プロパティを呼び出します。
<HTML>
<HEAD>
<TITLE>Simple WSC example</TITLE>
<STYLE>
.simple
{
behavior: url(simple.wsc) ;
}
</STYLE>
</HEAD>
<BODY onload="startup()">
<h1>Simple Demo</h1>
<div class="simple" id="simple"></div>
<script language="JScript">
function startup()
{
simple.message = "Hello World"
simple.display()
}
</script>
</BODY>
</HTML>
Active Server Pages の実装
ASP 環境で simple.wsc を使用する場合は、ビヘイビアとは少し違います。コンポーネントをクライアント上ではなくサーバー上でインスタンス化する必要があるからです。サーバーで登録せずにコンポーネントを作成するために、Visual Basic Scripting Edition (VBScript) コードはスクリプト、すなわち、Windows Script Component Runtime によって提供されるモニカを使用します。インスタンスが作成された後は、HTML の例と同じように、message プロパティが設定され、display メソッドが呼び出されます。
<HTML>
<HEAD>
<TITLE>Simple WSC ASP example</TITLE>
</HEAD>
<BODY>
<h1>Simple Demo</h1>
<%
dim simple
' Create an instance of simple.wsc from the file system
' You could register the component rather than doing this
set simple=getobject("script:c:\demo\simple.wsc")
' set the message property
simple.message = "Hello World"
' Call the display method
simple.display
%>
</BODY>
</HTML>
Windows Script Host
Windows Script Host (WSH) での使用は、ASP 環境よりさらに単純であり、まったく同じコードを使用します。唯一の違いは、コンポーネントの実行時の動作にあります。display メソッドが呼び出されると、コンポーネントは message の値を含んだメッセージ ボックスを作成します。
dim simple
' Create an instance of simple.wsc from the file system
' You could register the component rather than doing this
set simple=getobject("script:c:\demo\simple.wsc")
' set the message property
simple.message = "Hello World"
' Call the display method
simple.display
ログイン画面コンポーネント
より現実的な状況での Windows Script Components の使用例を示すために、私はログイン画面コンポーネントを作成しました。このコンポーネントはかなり単純です。HTML ベースのログイン画面を表示する display メソッドを持っています。このコンポーネントのユーザー インターフェイスとして HTML を使用するための鍵は、WSC ランタイムによって提供される <resource> 要素です。<resource> を使用することによって、テキスト ブロックをコンポーネントに挿入して、それに ID を与え、スクリプト内で参照することができます。このログイン画面コンポーネントでは、ログイン フォーム用の HTML を含む 1 個のリソースを用意しました。
<resource id="login">
<![CDATA[
<form method="POST" action="login.asp">
<div>
<center>
<table border="0">
<tr>
<td width="50%" align="right">User Name:</td>
<td width="50%"><input type="text" name="T1" size="20"></td>
</tr>
<tr>
<td width="50%" align="right">Password:</td>
<td width="50%"><input type="password"
name="T2" size="20"></td>
</tr>
</table>
<p><input type="button" value="OK" id="btnSubmit"
name="Submit"><input type="reset"
value="Cancel" name="btnCancel"></p>
</center>
</div>
</form>
]]>
</resource>
リソースへのアクセスは簡単です。WSC ランタイム ライブラリによって提供される getResource 関数を、リソースの ID を指定して呼び出すだけです。
<script language="VBScript">
<![CDATA[
function display()
form = getResource("login")
' Check to see if the behavior handler is loaded
if isobject(Behavior) then
' set the innerHTML to be the value of the resource
element.innerHTML=form
' Check to see if the ASP handler is loaded
elseif isobject(ASP) then
'write in the html from the resource
response.write form
else
' ASP and Behavior not loaded so display the HTML in a new
' instance of IE
set ie=createobject("InternetExplorer.Application")
ie.height = 175
ie.width = 300
ie.menubar = false
ie.toolbar = false
ie.statusbar = false
ie.resizable = false
ie.navigate "about:blank"
'Loop until IE is finished displaying the HTML
Do while ie.busy: x=x+1: loop
ie.document.body.innerHTML = cstr(form)
ie.visible = true
end if
end function
]]>
</script>
リソースと簡単なスクリプトを追加するだけで、呼び出されたクライアントに応じて動作を変更するコンポーネントの作成が可能になります。複数の異なる環境を対象としたコードを書かなければならないが、何らかの形で統一されたユーザー インターフェイスにしたいという場合は、これが本当に役に立ちます。
Web ページでログイン WSC を活用するために、私は要求が Internet Explorer 5 からのものかどうかを検出する単純な ASP スクリプトを書きました。もしそうであれば、このスクリプトはクライアントサイド HTML ページ (login.htm) にリダイレクトし、そこで WSC がビヘイビアとして参照されます。そうでない場合は、このスクリプトは WSC を使用して HTML を ASP ファイルからの Response ストリームに出力します。
<HTML>
<HEAD>
<TITLE>Simple WSC ASP example</TITLE>
</HEAD>
<BODY>
<h1>Simple ASP Demo</h1>
<%
Set bc = Server.CreateObject("MSWC.BrowserType")
if bc.browser = "IE" and bc.version >= 5 then
response.redirect "login.htm"
else
dim simple
' Create an instance of simple.wsc from the file system
' You could register the component rather than doing this
set simple=getobject("script:c:\demo\login.wsc")
' Call the display method
simple.display
end if
%>
</BODY>
</HTML>
Windows Script Host から同じ WSC を使用するために、私は login.vbs を作成しました。これは、コンポーネントのインスタンスを作成して、display メソッドを呼び出します。WSC が Internet Explorer または ASP 環境以外のクライアントから呼び出されたときには、Internet Explorer のインスタンスを作成し、サイズを変更して、ツールバーなどをオフにします。そして、ドキュメント オブジェクト モデルを使用して、リソースのコンテンツを挿入します。そして、Internet Explorer を表示します。これは貧相なダイアログ ボックスといったようなものですが、必要なユーザー入力を受け取って、それをサーバーに渡します。
set ie=createobject("InternetExplorer.Application")
ie.height = 175
ie.width = 300
ie.menubar = false
ie.toolbar = false
ie.statusbar = false
ie.resizable = false
ie.navigate "about:blank"
'Loop until IE is finished displaying the HTML
Do while ie.busy: x=x+1: loop
ie.document.body.innerHTML = cstr(form)
ie.visible = true
まとめ
Windows Script Components は、軽量なコンポーネント作成メカニズムであり、Windows プラットフォームの他の主要なテクノロジと組み合わせて、呼び出されたアプリケーションに適応するコンポーネントを作成することができます。この記事で紹介した例はかなり単純ですが、Windows Script Components でどんなことができるのか、そして、あなたの次の Web アプリケーションでどんなふうに使えるのか、ある程度のヒントを提供できたと思います。いつもと同様、Windows Script グループ宛にメールで (msscript@microsoft.com)、またはニュースグループ (news:msnews.Microsoft.com.microsoft.public.scripting.scriptlets) に英文でフィードバックをお寄せください。
Andrew Clinick は、Microsoft Script Technology グループのプログラム マネージャであり、スクリプトに関係するものならば、おそらく何らかの形で彼が関わっています。彼は余暇の大半をアメリカのテレビでラグビーの中継番組を探し、新しいアメリカ人の同僚にクリケットを説明するのに費やしています。