豊田 孝

 第9回から前回までの合計6回にわたり,シェル名前空間を取り上げました。今回からはシェル名前空間とは切っても切れない関係にある「ショートカット」オブジェクトを紹介していきます。本論に入る前に,シェル名前空間と「ショートカット」オブジェクトの関係を簡単に復習しておきましょう。

シェル名前空間と「ショートカット」オブジェクトの関係

 ここでは簡単な実験を通して,名前空間の一つである「最近使ったファイル」名前空間と「ショートカット」オブジェクトの関係を復習します。まず,次のような作業を行ってください。この作業は,Windowsを使う多くの人がよく行う作業でしょうから,作業風景をイメージするだけでも結構です。

(1)本日の10行JScriptプログラムをコピーする
(2)「メモ帳」を起動し,コピーしたコードを貼り付ける
(3)「メモ帳」のファイル保存機能を使って,「No15ShortCutRead.js」として任意のフォルダに保存する

 この作業が完了すると,作成したばかりの「No15ShortCutRead.js」ファイルへのショートカット・オブジェクトが「最近使ったファイル」名前空間内に自動的に作成されているはずです。以後,私たちは「No15ShortCutRead.js」ファイルの格納位置などを意識することなく,ショートカット・オブジェクトを使って効率的に編集作業ができるようになります。このため,ショートカット・オブジェクトというのは,実際のファイルを抽象化する技術であるといえます。

 一方,名前空間は,作成される複数のショートカット・オブジェクトを機能別に分類して,効率的に管理する空間といってよいでしょう。以上で簡単な復習は終了します。なお,「最近使ったファイル」名前空間の詳細については,第12回を参照してください。

 ここで視点を変え,皆さんに次のような疑問を提出したいと思います。

“ショートカット・オブジェクトと実際のファイルの関係はどうなっているのでしょう?”

 皆さんはどのような回答を思い浮かべるでしょう。さっそく,回答を探してみましょう。

「ショートカット」オブジェクトと実際のファイル

 私たちがショートカット・オブジェクトを開くと言うことは,それは最終的には,ショートカット・オブジェクトに関連つけられた実際のファイルを開くことを意味します。つまり,ショートカット・オブジェクトは,実際のファイルにアクセスするための情報を内部に持っていることになります。ここで,本日の10行プログラムを見ていただきましょう。

 まず,VBScriptコードです。


'*********************************************************
'プログラム行数 = 9
'機能:ショートカット・オブジェクトからデータを読み出す
'コピー・アンド・ペースト後,
'No15ShortCutRead.vbsとして保存する
'*********************************************************
Dim myHelper, myShortCut
Set myHelper = CreateObject("Shell.Application.1")
Set myShortCut = myHelper.NameSpace(8).Items.Item(1)

If (True = myShortCut.IsLink) Then
WScript.Echo myShortCut.Path + " =>" + myShortCut.GetLink.Path
Else
WScript.Echo myShortCut.Name + " =>" + myShortCut.Path
End If

Set myHelper = Nothing
対応するJScriptコードは次のようになります。

/*
'*********************************************************
'プログラム行数 = 7
'機能:ショートカット・オブジェクトからデータを読み出す
'コピー・アンド・ペースト後,
'No15ShortCutRead.jsとして保存する
'*********************************************************
*/
var myHelper = new ActiveXObject("Shell.Application.1");
var myShortCut = myHelper.NameSpace(8).Items().Item(1);

if (true == myShortCut.IsLink)
WScript.Echo (myShortCut.Path + " =>" + myShortCut.GetLink.Path);
else
WScript.Echo (myShortCut.Name + " =>" + myShortCut.Type);

myHelper = null;
図1●サンプル・プログラムの実行結果
図2●「No15ShortCutRead.vbs」ショートカットのプロパティ画面
図3●「No15ShortCutRead.exe」の実行結果(Windows 2000)
図4●「No15ShortCutRead.exe」の実行結果(Windows XP)
 このプログラムはまず,数値「8」に対応する「最近使ったファイル」名前空間内の第2オブジェクト(Item(1))を呼び出します。呼び出した後,そのオブジェクトがショートカット・オブジェクトであることを次のコードで判定しています。

If (True = myShortCut.IsLink)

 IsLinkは前回も触れたように,myShortCutオブジェクトが持つプロパティです。このプロパティがTrueを返してきた場合,次のコードが実行されます。

WScript.Echo myShortCut.Path + " =>" + myShortCut.GetLink.Path

ここで注意していただきたいのは,次の2つのコードの違いです。

・myShortCut.Path
・myShortCut.GetLink.Path

 プログラムを実行すると,これらのコードは図1[拡大表示]のような情報を返してきます。この実行結果は,myShortCut.PathがmyShortCutオブジェクト自身の情報を返し,myShortCut.GetLink.Pathがリンク先の実際のファイル情報を返していることを示しています。この返される情報の違いはGetLinkコードにあります。ここでは,便宜上,GetLinkコードを次のように整理することにします。

“myShortCutオブジェクトは,実際のファイルを管理するための情報を持っている。その情報は専用のデータベースに格納されている。GetLinkは専用データベースにアクセスするための情報を提供するプロパティである”

 ここで,「No15ShortCutRead.vbs」ファイルを右クリックし,「ショートカットの作成」を選択してみましょう。「No15ShortCutRead.vbs」のショートカット・オブジェクトが作成されます。この「No15ShortCutRead.vbs」のショートカット・オブジェクトのプロパティを見てみましょう(図2[拡大表示])。画面中ほどに「リンク先」という欄があり,その中に「C:\ITPro\Tenlines\No15\No15ShortCutRead.vbs」という文字列が入っています。この文字列は,先のmyShortCut.GetLink.Pathコードの実行結果と同じですから,専用データベースから読み出されている,と考えると分かりやすいと思います。

 「最近使ったファイル」名前空間内の,他のオブジェクトも調べたい場合には,本日用意した補助プログラム「No15ShortCutRead.exe」をダウンロードし,実行してみてください。この補助プログラムを起動すると,「最近使ったファイル」名前空間内のすべてのオブジェクトのリストが表示されます。そのリスト情報から目的のオブジェクトを選択し,OKボタンをクリックすると図3[拡大表示],図4[拡大表示]のような情報が返されます。

 補助プログラム「No15ShortCutRead.exe」を試した後は,10行プログラム内のItems.Item(1)の数値「1」をいろいろ変更してみてください。

 本日は,シェル名前空間とショートカット・オブジェクトの関係を復習するとともに,ショートカット・オブジェクトが持つ情報を読み出す10行プログラムを紹介いたしました。本文で触れたように,ショートカット・オブジェクトは専用データベースを持っています。次回は専用データベースからデータを読み出すだけはなく,データベースにデータを書き込んでみます。ショートカット・オブジェクトにはどのような変化が見られるでしょう。データベースへの読み書きができるようになった後は,目的のシェル名前空間内部にショートカット・オブジェクトを作成する技術を紹介する予定です。これらの技術を身に付けておくと、大幅に変更されると言われるWindows XPの「スタート」メニューの内容を効率的に理解できるようになります。お楽しみに。それではまた次回お会いいたしましょう。ごきげんよう!