豊田 孝

図1●「最近使ったファイル」のGUI
 本日は,Windowsの「スタート」メニューでおなじみの「最近使ったファイル」を取り上げ,シェル名前空間への理解をより一層深めます。実は,「最近使ったファイル」も名前空間なのです。

 「最近使ったファイル」は名前空間である,といきなりいわれて当惑されている方もいらっしゃるでしょう。そこで,「最近使ったファイル」名前空間のグラフィカル・ユーザー・インタフェース(GUI)をまず確認しておきましょう。私のWindows XP RC1環境の「スタート」ボタンをクリックすると,図1[拡大表示]のような画面が表示されます。

 これは,表現を変えると,Windows XPの世界における「最近使ったファイル」名前空間をビジュアル表現したものである,と言えます。お時間のあるときに,Windows 2000世界のGUIと比較してみてください。「スタート」メニューが大幅に変更されていることはもちろんのこと,「最近使ったファイル」メニュー自身の表示位置も変更されていることがわかります。また,第9回から取り上げてきたシェル名前空間と「スタート」メニューの関係もはっきりわかります。

 それではここで念のために,第9回で紹介した補助プログラム「No9ListNameSpaces.exe」(ダウンロードはこちら)を実行し,「最近使ったファイル」名前空間情報を確認しておきましょう(リスト1)。補助プログラムの機能詳細については,第9回や第11回連載記事を参照してください。

 この情報をはじめて目にした人は当初混乱するかもしれませんが,本稿を最後までお読みいただければ,情報の意味が理解できるようになり,この情報を活用できるようになります。現時点では,これはOSが管理している貴重な内部情報である,と考えておいてください。

 数値「8」をはじめとして,ほとんどの情報は同じです。しかし注意深く比較してみると,内部の名前空間名が,Windows XPでは,Windows 2000での「Recent」から「最近使ったファイル」へと日本語化されていることが分かります。これはささいな変更のように思われますが,丁寧なローカライズ作業が行われていることを示しています。さて,皆さんの環境ではどのような結果が返されていることでしょう?

 リスト1の出力情報が示すように,「最近使ったファイル」名前空間はファイルフォルダという性格を持っています。このため,この名前空間には,常識的には複数のファイルが格納されていると考えることができます。これはきわめて自然な解釈です。それではここで,「最近使ったファイル」名前空間に格納されているファイルを自動操作するプログラムを作ってみましょう。さあ皆さん,どこから手をつけますか? 本連載では終始一貫して,次のような考え方を取ってきました。

“相談相手を呼び出し,相談を持ちかける”

 ここでいう名前空間は,正式には,「シェル名前空間」ですから,相談相手は当然シェルになります。以上の考え方から,次のようなプログラムを作ってみました。

 まず,VBScriptサンプルコードを示しましょう。


'*******************************************************************
'プログラム行数 = 4
'機能:「最近使ったファイル」名前空間内のオブジェクトを自動起動する
'コピーアンドペースト後,
'No12RecentRun1.vbsとして保存する
'*******************************************************************
Dim myHelper
Set myHelper = CreateObject("Shell.Application.1")
myHelper.NameSpace(8).Items.Item(0).Verbs.Item(0).DoIt
Set myHelper = Nothing
対応するJScriptコードは次の通りです。

/*
'*******************************************************************
'プログラム行数 = 3
'機能:「最近使ったファイル」名前空間内のオブジェクトを自動起動する
'コピーアンドペースト後,
'No12RecentRun1.jsとして保存する
'*******************************************************************
*/
  var myHelper = new ActiveXObject("Shell.Application.1");
  myHelper.NameSpace(8).Items().Item(0).Verbs().Item(0).DoIt();
  myHelper = null;
 ここでちょっと視点を変え,「相談相手を呼び出し,相談を持ちかける」という文を次のように書き直してみましょう。

“相談相手を呼び出し,この数日間悩んでいた問題を,その場で切り出す”

 どちらかといえば,こちらの文の方が私たちの日常生活を正確に反映している感じがしますね。この日常風景をVBScriptコードで記述すれば,次のようなプログラムになるでしょう。

'*********************************************************************
'プログラム行数 = 5
'機能:「最近使ったファイル」名前空間内のオブジェクトを自動起動する
'コピーアンドペースト後,
'No12RecentRun2.vbsとして保存する
'*********************************************************************
Dim myHelper,myProblem
Set myHelper = CreateObject("Shell.Application.1")
Set myProblem = myHelper.NameSpace(8).Items.Item(0).Verbs.Item(0)
myProblem.DoIt
Set myHelper = Nothing
 表現がやわらかくなった分,ソース・コードが一行増えています。これ以外のプログラミングももちろん可能ですが,ソース・コードを書き始める前にちょっとした間を置く重要性に触れたおきたかったのです。参考になれば幸いです。このVBScriptコードのJScriptコードへの移植は皆さんにお任せします。時間を見つけて,ぜひ挑戦してみてください。

図2●「最近使ったファイル」名前空間内に置かれているオブジェクトのリスト
図3●選択したオブジェクトが持つメソッドの詳細
 ここに紹介した2種類のソースコードはいずれも,「最近使ったファイル」名前空間を選択(NameSpace(8))した上で,「名前空間内の第1ファイル・オブジェクト」を指定(Items.Item(0))し,「開く」動作を実行するように依頼(Verbs.Item(0).DoIt)しています。このため,Items.Item(0)の「数値0」を1や2に変更すれば,名前空間内の第2,第3のファイル・オブジェクトが開かれます。数値を変更するだけで,目的のファイル・オブジェクトを簡単に自動操作できます。ここで一部の方は,次のような疑問を持つのではないでしょうか。

(1)ファイルオブジェクトと,対応する数値の関係がわからない
(2)「開く」以外の動作と,対応する数値の関係がわからない

 これから紹介する本日の第1補助プログラム「No12RunRecentMethods.exe」(ダウンロードはこちら)を実行すると,これらの疑問に対する回答が得られます。数値を選択するだけで,「最近使ったファイル」名前空間を楽しみながら,自由自在に探検できます。このプログラムを私のWindows XP RC1環境で実行すると,次のような結果が返されます。入力するのは数値だけです。しかも入力できる数値候補も表示されています。

図4●拡張子「.inf」を持つファイルのメソッドの一部を実行したところ
 図2[拡大表示]はソース・コード内のItems.Item(0)のItemsの内容,つまり,「最近使ったファイル」名前空間内に置かれているオブジェクトのリストを表示しています。図3[拡大表示]は,選択したオブジェクトが持つ動作内容,つまり,メソッドの詳細を示しています。お時間のあるときに,この補助プログラムとサンプル・コードを併用して,「最近使ったファイル」名前空間を探検してみてください。表示されるメソッド情報は,オブジェクトの種類に応じて変わります。表示される個々のメソッド情報をじっくり眺めると,Windows 2000からWindows XPへの細かな変化がはっきり認識できるはずです。例えば,拡張子「.inf」を持つファイルのメソッドの一部を実行すると,図4[拡大表示]のような画面が表示されてきます。

 これはファイルとプログラムの対応付け画面ですが,「推奨されるプログラム」項目が用意され,一般ユーザーが戸惑わないような配慮が加えられています。また,画面下端を見ると分かるように,対応付ける適切なプログラムが現在の環境に存在しない場合,インターネット上から検索できるようにもなっています。繰り返し実行してみるとよいでしょう。

 このことは,OSの内部情報が数値によって効率的に管理されていることを示しています。そして,これがより重要なのですが,β2からRC1への移行に見られたように,情報と数値の対応関係がビルドやバージョンごとに変わる可能性がある,ということです。システム管理者などはこの変更をきちんと把握しておくことが重要でしょう。事実,私の環境ではRC1のインストール方法によっては,名前空間数が異なっています。補助プログラムを実行し,サンプル・コードの数値を変えて,いろいろ実験してみてください。

図5●補助プログラム「ListRecentNameSpace.exe」の実行画面
 ところで,一部の方はすでにお気づきでしょうが,最初の図にはBin(ショートカット)という情報が見えます。Binはここでは無視していただくとしても,(ショートカット)は気なるところです。実は,これは「最近使ったファイル」名前空間は,ショートカット・オブジェクトで構成されていることを示しているのです。ショートカット・オブジェクトは,リンク情報を持っています。これから紹介する本日の第2補助プログラム「ListRecentNameSpace.exe」(ダウンロードはこちら)を実行すると,図5[拡大表示]のような画面が表示されます。

 「No12ListRecentNameSpace.exe」補助プログラムは,ショートカット・オブジェクトからリンク先情報を取り出し,それらをHTMLファイルとして「C:」フォルダに格納し,Internet Explorerを起動して,ファイル内容を自動表示しています。つまり,「最近使ったファイル」名前空間を,HTMLタグ・コードでビジュアル表現しているわけです。このため,表示される画面上のハイパーリンクをクリックするだけで,名前空間内のファイルを操作できます。ぜひ活用してみてください。

 本日は,「最近使ったファイル」名前空間を取り上げ,その名前空間内に格納されている情報をプログラミングする例を紹介しました。「最近使ったファイル」名前空間はどちらかといえば,私たちの日常生活に密着しており,すでに慣れ親しんでいる空間の一つといえるでしょう。しかし,多くの人はこれまで,「スタート」メニューをまず開き,「最近使ったファイル」メニューを開く,という手順を繰り返していたのではないかのではないかと思います。本稿を読み終えた今,「最近使ったファイル」メニューに対してどのようなイメージをお持ちでしょうか?

 次回は,楽しいシェル・プログラミング第2弾として,別の名前空間を取り上げます。次回の楽しみのため,具体的な名前空間名は伏せておきます。一部の方は,名前空間とActive Directoryなどとの関係を知りたいとうずうずしていることでしょうが,基本を抑えながら,一歩一歩前進致しましょう。それでは次回またお会いいたしましょう。ごきげんよう!