豊田 孝

 前回はWindows 2000/XPの名前空間を紹介し,次のように定義しました。

“名前空間とは,シェルが内部で使用している特殊なフォルダである”

 本日はこの定義の意味を吟味し,これまで何度も取り上げたデスクトップを,名前空間という視点から振り返ってみることにします。それではさっそく本論に入りましょう。

名前空間は単なるフォルダか?

 まず次のようなソース・コードを見ていただきましょう。


'*********************************************************
'プログラム行数 = 4
'機能:コントロールパネルを自動操作する
'コピー・アンド・ペースト後,
'No10CPVerbs.vbsとして保存する
'*********************************************************
Dim myHelper
Set myHelper = CreateObject("Shell.Application.1")
myHelper.NameSpace(3).Items.Item(2).Verbs.Item(0).DoIt
Set myHelper = Nothing
 これはすでに何度も紹介しているコントロールパネル内の数値2に対応する「ユーザーとパスワード」コントロール画面を開くコードです。ここでは,次のソース行に注目してください。

myHelper.NameSpace(3).Items.Item(2).Verbs.Item(0).DoIt

 このソース行を左から右に向かってじっくり眺めてみてください。このソース行(以後タイプAコードと略記)は最終的に,次のコード(以後タイプBコードと略記)を実行しています。

Rundll32.exe C:\WINNT\System32\netplwiz.dll,UsersRunDll

 2つのソース行を比較すると分かるように,タイプAコードでは,Windows固有のプログラム名やフォルダ名などを一切使っていません。このような技術の動きを一般には“抽象化”などと呼んでいます。

 抽象化のメリットはいろいろあるのですが,プログラムが分かりやすくなるというのもメリットの一つといってよいでしょう。コマンド名や,そのコマンドを実行させるための各種情報を知らなくても,上記のコード行のように,カッコ内の数字を変えるだけで,さまざまな機能を論理的に呼び出すことができます。カッコ内にどんな数字を入れたらどんな機能が呼び出せるかは,今までの連載や,今回の連載の後半で触れています。

 皆さんは,“この操作は直感的で分かりやすい”などという表現をどこかで聞いたことがあるでしょう? この直感的な操作を可能としているのは,まさにこの抽象化技術といってよいでしょう。そこで,名前空間定義を次のように書き換えることにしましょう。

“シェルの持つ名前空間は,フォルダ名をはじめとするこれまでのWindows固有機能を抽象化した,各種オブジェクトを管理する空間である”

図1●サンプル・プログラムの実行例(Windows 2000)
図2●サンプル・プログラムの実行例(Windows XP)
 これまでの連載ですでに紹介したように,コントロールパネルには「画面」や「ユーザーとパスワード」などのオブジェクトがたくさんありました。上記の定義にあてはめると,コントロールパネルという名前空間は,これらオブジェクトを管理する空間の一つである,ということになります。いかがでしょうか?

名前空間は開けるのか?

 抽象化されているとはいえ,名前空間がフォルダなら,それを開くことができるはずですね。これは,私たちのこれまでの経験から直感的に導き出せる結論です。フォルダを開いた経験を持たない人はまずいません。ここで皆さんに質問です。フォルダとしての名前空間を開く機能を提供しているのは,どのような相談相手か,想像できますか?

 タイプAコードを見ると,次のようなコードが使われています。

myHelper.NameSpace(3)

 このコードは,“myHelper(シェル)は複数の名前空間を管理している”と解釈できます。ということは,私たちは“myHelperは名前空間を開く機能も提供しているのではないか?”と期待できます。これは思考の流れとしてはきわめて自然であるといえるでしょう。結論を言ってしまえば,myHelperはそのような機能を持っています。具体的なソース・コードを見ていただきましょう。

 まず,VBScriptコードからです。


'*********************************************************
'プログラム行数 = 4
'機能:デスクトップ名前空間を開く
'コピー・アンド・ペースト後,
'OpenMethod.vbsとして保存する
'*********************************************************
Dim myHelper
  Set myHelper = CreateObject("Shell.Application.1")
  myHelper.Open(0) 'デスクトップ名前空間を開く
  Set myHelper = Nothing
 対応するJScriptコードは次のようになります。

/*
'*********************************************************
'プログラム行数 = 3
'機能:デスクトップ名前空間を開く
'コピー・アンド・ペースト後,
'OpenMethod.jsとして保存する
'*********************************************************
*/
  var myHelper = new ActiveXObject("Shell.Application.1");
  myHelper.Open(0);
  myHelper = null;
図3●「No10ListDTMethods.exe」プログラムの実行画面
 いかがでしょう。myHelperは,「Open」という機能(メソッドと呼ぶのでしたね)を持っています。ついでに紹介しておきますが,「Explore」というメソッドも持っています。後日お時間のあるときに試してみてください。OpenメソッドとExploreメソッドの間にはどのような違いがあるのでしょうか? ご自分で確認してみてください。

 これまでの説明はきわめて論理的でどこにも問題がないように思われます。しかし,“名前空間を開く”という文をもう一度じっくり読み返してください。この文には主語がありません。だれが“開く”のでしょう?これまでの説明では,“シェルが名前空間を開く”ということでした。しかし,“名前空間が自分自身を開く”という文構成も可能であったらどうでしょう。むしろこちらの解釈の方が分かりやすいのではないでしょうか? 実は,このような解釈がWindows XPの世界で可能となろうとしているのです。ではここで,デスクトップ名前空間を開くソース・コードを見てみましょう。


'*********************************************************
'プログラム行数 = 4
'機能:デスクトップ名前空間を開く
'コピー・アンド・ペースト後,
'OpenSelf.vbsとして保存する
'注:このコードはWindows 2000環境では動作しない
'*********************************************************
Dim myHelper
  Set myHelper = CreateObject("Shell.Application.1")
  myHelper.NameSpace(0).Self.Verbs.Item(0).DoIt
  Set myHelper = Nothing

/*
'*********************************************************
'プログラム行数 = 3
'機能:デスクトップ名前空間を開く
'コピーアンドペースト後,
'OpenSelf.jsとして保存する
'注:このコードはWindows 2000環境では動作しない
'*********************************************************
*/
  var myHelper = new ActiveXObject("Shell.Application.1");
  myHelper.NameSpace(0).Self.Verbs().Item(0).DoIt();
  myHelper = null;
図4●「No10ListDTMethods.exe」で0を入力した結果(Windows 2000)
 このサンプル・プログラムをWindows 2000とWindows XPそれぞれの環境で実行すると,図1[拡大表示],図2[拡大表示]のような結果を返します。

 ご覧のように,Windows 2000環境では正常に動作せず,エラーが出てしまいます。原因はなんでしょうか? エラー・メッセージを見ると,メモリー関連のエラーが発生しています。後ほど分かりますが,このエラーはサンプル・プログラムを作成した私のエラーではありません。“メモリーが不足しています”というエラー情報は,実行に必要な“メモリーを確保していない”,つまり,Windows 2000では,このサンプル・プログラムを実行するための仕組みを備えていない,ということです。そこで,本日はこのあたりの事情を知らせてくれる補助プログラム「No10ListDTMethods.exe」を用意してみました(ダウンロードはこちら)。このプログラムは,名前空間が持つメソッドの一覧を表示します。

 このプログラムを起動すると図3[拡大表示]のような初期画面が表示されます。目的の名前空間に対応する数値の入力が求められますから,ここではデスクトップ名前空間に対応する数値である0を入力してください。なお,数値と名前空間の対応関係情報は,前回(第9回)紹介した補助プログラム「No9ListNameSpaces.exe」を実行すると取得できます。0を入力すると,Windows 2000とWindows XPではそれぞれ図4図5のような情報が返されます。

図5●「No10ListDTMethods.exe」で0を入力した結果(Windows XP)
 これらの2つの画面から分かることは,Windows 2000のデスクトップ名前空間(数値0に対応)には“メソッドが実装されていない”ということです。メソッドが実装されていなければ,プログラムの実行もできませんね。表現を変えれば,“Windows 2000では,名前空間の抽象化が完了していない”といってよいでしょう。また,Windows XPは“よりわかりやすいOSに成長している”といってよいでしょう。

 本日は名前空間を再定義するとともに,Windows 2000とWindows XPのデスクトップを名前空間という視点から振り返って見ました。次回は,Windows 2000とWindows XPの名前空間構成の違いに焦点を当ててみようと思います。それでは次回またお会いいたしましょう。ごきげんよう!