自分好みのガジェットを作る! Windowsサイドバーガジェット作り入門

第6回 ガジェットのAPI,セキュリティ,ActiveXの組込みなど

この記事を読むのに必要な時間:およそ 4.5 分

ガジェットの中で外部ウェブサイトへ遷移しない

よくあるかどうかはわかりませんがガジェットの中でミニブラウザを!といった考えを持つ開発者の方がいらっしゃるかと思いますが,決してそのようなことは考えないでください。

これも推奨しない理由はガジェットからのローカルのリソースへのアクセスが無制限となっていることによります。

※当初,ガジェットはマイ コンピュータゾーンで動作している旨の説明となっていましたがガジェットはマイ コンピュータゾーンに属さず,Internet Explorerの設定にかかわらずActiveXの動作が許可されるとのご指摘をいただきました。お詫びして訂正させていただきます。

以下のような内容のHTMLであるページがhttp://www.example.com/test.htmlにあるとします。

<pre id="output">[Output]</pre>
<script>
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var tf = fso.OpenTextFile('C:\\Windows\\win.ini', 1, 0);
    document.getElementById('output').innerText = tf.ReadAll();
</script>

試しにこのページをInternet Explorerで開いてみると,情報バーが出てくるはずです。当然信頼できないサイトでActiveXObject(COM)を利用することを無断で許可することはありません。

そして次にこのHTMLをガジェットの中でiframe要素を使って読み込むようにして,ガジェットをサイドバーに追加します。すると何ごとも無かったかのようにガジェット中のiframeにwin.iniが表示されます。

これはインターネットにあるHTML(のスクリプト)がローカルコンピュータのデータを読み取ることができてしまったということです。これをpre要素ではなく何処か外部に投げるようにしたら怖いですよね。ガジェットの中でウェブページを開くとそのような危険な状態になってしまうということです。

ガジェットのリンクなどはクリックして遷移する必要がある場合には自動的に外部のウィンドウで開くようになっています。ですから,わざわざ遷移できるような仕組みを用意すると問題となります。

ActiveX(Flash,Silverlight等)を組み込む

ガジェットは以前何度か説明している通り,Internet Explorerベースです。ということはActiveXコントロールをホストすることができるということでもあります。

ActiveXコントロールをホストできるとどのような恩恵を受けることができるのでしょうか?

ActiveXコントロールのホストというと判りにくいですが,要するにHTMLのobject要素で埋め込む「アレ」です。よく目にするものとしてはAdobe Flash Playerやメディアプレイヤーなどがあります。ということはガジェット内でもFlashやメディアプレイヤーなどを普通のWebサイトと同様に利用できるということです。

Flash以外にもSliverlightも実際はobject要素で埋め込む形になるので,ガジェットをSilverlightで作ってしまうことも可能ということです。

埋め込み方はWebページで使うときと変わりないので説明は割愛します。

x64版Windowsでの制限

Windows Vistaには32bit版と64bit版(以下x64)という二つのプラットフォーム向けのものが用意されています。この違いが場合によっては問題を引き起こすことがあります。

通常32bitアプリケーションはx64のVista上でも,ほとんど変わりなく利用することができます。

さらにサイドバーガジェットは通常HTML+JavaScriptで構成されるので,プラットフォーム依存は何もなく,問題なく動くように思えます。

ところが一つ前に説明したActiveXのホストを行っている場合にうまく動かないことがあるという問題が発覚します。例えば現状でよく使いたくなるであろうAdobe Flash Playerは動きません。

原因は64bitのプロセスに32bitのライブラリをロードすることはできないという元々のWindowsの制限にあります(その逆の32bit上に64bitというパターンもありえます)。その制約を受けた上でサイドバー自体は64bitアプリケーションとして実行され,サイドバーが持つInternet Explorerも64bit版となります。

そのために32bit版のみ提供で64bit版には提供されていないFlash Playerなどを表示できなくなるのです。素の64bit版Internet ExplorerでFlashを表示できないのも同様の理由です

回避策

裏技的ですが32bit版のサイドバーを起動することでこの問題を回避できます。32bit版のサイドバーは以下のパスになります。

\Program Files(x86)\Windows Sidebar\sidebar.exe

32bit版のサイドバーを起動することで32bit版のActiveXなどをホストできるようになりますが,32bit版を起動し直すことをユーザに指示する必要があるなど根本的な解決にはならないのでオススメはできません。

著者プロフィール

沢渡真雪(さわたりまゆき)

普段はASP.NETやPerlでWebアプリケーションを書くのが主。興味の向きはWindows一般から.NET Framework,Perl(Plaggerとか)やMac OS Xなど。

URLhttp://www.misuzilla.org/