ガジェットのAPI
Windowsサイドバーガジェット用に用意されている拡張APIについて、
スキーム
- gImage スキーム
gImageスキームはhttpやfileスキームと同じように指定して、
ファイルのサムネイルや画像をリサイズした上で読み込むためのスキームです。 例えば、
ファイルのサムネイルを得る場合に利用できます。使い方は以下のような感じです。
オブジェクト
- System.
Environment (環境) 環境変数の取得のためのメソッド、
コンピュータの名前を取得するプロパティが提供されています。 - System.
Gadget. SideShow (Windows SideShow) Windows SideShow用のAPIを持っています。SlideShowではありません。SideShowとはノートコンピュータの液晶裏についたサブディスプレイなど情報補助表示装置です。その補助表示を操作するためのAPIが用意されています。
- System.
ContactManager (アドレス帳) メールなどのアドレス帳の内容を持っています。
- System.
Machine (コンピュータ情報) コンピュータそのものの情報、
例えば、 電源やCPU使用率、 メモリ使用率などをもつオブジェクトをSystem. Machine.*に持っています。 - System.
MessageStore (メール) メールボックスの状態などを得ることができるオブジェクトです。未読件数などを表示するのに利用できます。
- System.
Network. Wireless (無線LAN) その名のとおり無線LANの接続状況についての情報を持っています。
- System.
Shell (ファイル・ シェル操作) ファイル操作を助けるためのAPIを持っています。例えば、
ファイルの移動やドラッグアンドドロップで渡された情報からファイル情報を簡単に得るための仕組みなどを提供してくれます。 - System.
Sound (音をならす) 簡易的に音を鳴らすためのAPIを提供します。音楽を鳴らすというよりは効果音を鳴らすだけという用途向きです。もし音楽再生を求めているのであればWindows Media Playerを使うなどしてください。
- System.
Time (時刻) 現在の時刻とタイムゾーンの管理を行うオブジェクトです。
セキュリティ的に気をつける点
ガジェットはマイコンピュータゾーンかそれ以上に危険であると思うべき
つまりユーザに特に訪ねることなく、
また、
不用意にevalしない
evalというのは知っての通り任意のJavaScriptを評価する関数です。
evalを使う場面はJSONを使う場合
そもそもevalを利用して外部から得たスクリプトの文字列を評価するというのは、
なぜならば先ほども述べたとおり、
では、
もっともevalを必要とする場面というのは、
エスケープのし忘れに気をつける
いわゆるXSS(クロスサイトスクリプティング)を防ぐという話です。
悪意ある入力を引き継いでガジェットを動作させることは一般的なWebアプリケーションよりは困難ですがあり得ないわけではないですし、
そもそもそういうセキュリティ面もそうですが、
また、
ガジェットの中で外部ウェブサイトへ遷移しない
よくあるかどうかはわかりませんがガジェットの中でミニブラウザを!といった考えを持つ開発者の方がいらっしゃるかと思いますが、
これも推奨しない理由はガジェットからのローカルのリソースへのアクセスが無制限となっていることによります。
※当初、
以下のような内容のHTMLであるページがhttp://
試しにこのページをInternet Explorerで開いてみると、
そして次にこのHTMLをガジェットの中でiframe要素を使って読み込むようにして、
これはインターネットにあるHTML(のスクリプト)がローカルコンピュータのデータを読み取ることができてしまったということです。これをpre要素ではなく何処か外部に投げるようにしたら怖いですよね。ガジェットの中でウェブページを開くとそのような危険な状態になってしまうということです。
ガジェットのリンクなどはクリックして遷移する必要がある場合には自動的に外部のウィンドウで開くようになっています。ですから、
ActiveX(Flash、Silverlight等)を組み込む
ガジェットは以前何度か説明している通り、
ActiveXコントロールをホストできるとどのような恩恵を受けることができるのでしょうか?
ActiveXコントロールのホストというと判りにくいですが、
Flash以外にもSliverlightも実際はobject要素で埋め込む形になるので、
埋め込み方はWebページで使うときと変わりないので説明は割愛します。
x64版Windowsでの制限
Windows Vistaには32bit版と64bit版(以下x64)という二つのプラットフォーム向けのものが用意されています。この違いが場合によっては問題を引き起こすことがあります。
通常32bitアプリケーションはx64のVista上でも、
さらにサイドバーガジェットは通常HTML+JavaScriptで構成されるので、
ところが一つ前に説明したActiveXのホストを行っている場合にうまく動かないことがあるという問題が発覚します。例えば現状でよく使いたくなるであろうAdobe Flash Playerは動きません。
原因は64bitのプロセスに32bitのライブラリをロードすることはできないという元々のWindowsの制限にあります(その逆の32bit上に64bitというパターンもありえます)。その制約を受けた上でサイドバー自体は64bitアプリケーションとして実行され、
そのために32bit版のみ提供で64bit版には提供されていないFlash Playerなどを表示できなくなるのです。素の64bit版Internet ExplorerでFlashを表示できないのも同様の理由です
回避策
裏技的ですが32bit版のサイドバーを起動することでこの問題を回避できます。32bit版のサイドバーは以下のパスになります。
32bit版のサイドバーを起動することで32bit版のActiveXなどをホストできるようになりますが、
メモリリーク
Internet Explorerでは特定のパターンでメモリがリークしてしまうことがあるということが、
このメモリリークパターンについては
JavaScript以外のスクリプト言語を使う
実はということもありませんが、
アクティブスクリプトと呼ばれる仕組みを使っているので、
他にも各種スクリプトエンジンをインストールすればJScriptとVBScript以外の言語を利用できるようになります。
Rubyを使いたいならActiveScriptRuby、
これはPerlのLWP::Simpleというモジュールのget関数をJScriptから呼んでいる例です(get関数はLWP::Simpleをuseすると公開される)。ちなみにこのLWP::Simpleのget関数というのはHTTPのリクエストを投げてレスポンス内容を返すという単純な関数です。
このようにアクティブスクリプトでは異なるスクリプト言語を混ぜて使うことができるところがとても面白いです。面白く便利ではあるものの、
alert的なメッセージボックスを利用したい
前回、
そこでalertのようなものを何とかして使う方法を考えるわけですが、
というところで気がついたのですがalertはInternet Explorerが用意しているものですが、
ということはこのMsgBox関数をJScript側から呼び出せればうまくいきそうな気がしてきました。JscriptとVBScript異なる言語が混じっても利用できるというのは前に説明済みのとおりです。
ただし、
ということでそのあたりを面倒見て、
このライブラリの使い方は簡単でまず以下のように読み込みます。
そして、
これを実行すると図のようなメッセージボックスが表示されます。
このライブラリは.NET Frameworkの System.
このライブラリでのメソッドは一つ目の引数が内容、
このコードは次の図のメッセージボックスを表示し、
これでalertやconfirmが無くても同等のことを実現できるようになりました。
最後に
ガジェットの作り方の連載は今回で最後になります。ちょっとしたHTMLとJavaScriptの知識で作れるので是非作ってみてはいかがでしょうか?
この連載がお読みいただいた方々の開発時に何らかの形でお役に立てることを願ってやみません。