2006 年 7 月 3 日 19 時 37 分

他にもあるショートカット


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


現在、リンク先を表示できるのは、.lnk ファイルだけだが、
リンク先を持つファイルは、.lnk ファイルだけではない。

たとえば、.url は、インターネットショートカットであり、
ファイル内部に URL を格納している。

Internet Explorer の管理するお気に入りも、
フォルダで分類されたインターネットショートカットだ。
次は、これを調べてみよう。

例によって、レジストリを探す。
拡張子「.url」
⇒ProgID「InternetShortcut」
⇒CLSID「{FBF23B40-E3F0-101B-8488-00AA003E56F8}」
⇒表示名「Internet Shortcut」

OLEVIEW の「All Objects」から、
「Internet Shortcut」を探す。(写真)
これも色々なインタフェースを実装していることが分かる。

定番の IPersistFile インタフェースも実装している。
また、IShellLinkW インタフェースも実装しているようだ。

では、IPersistFile ⇒ IShellLinkW の方法で試してみよう。

まずは、COM のクラスを定義する。
InternetShortcutClass としよう。
場所は、Interop フォルダ内にいれる。

========== InternetShortcutClass.cs ==========

using System;
using System.Runtime.InteropServices;

namespace LoaferShellEx.Interop {

    // シェルの提供する InternetShortcut COM クラス
    [ComImport]
    [Guid("FBF23B40-E3F0-101B-8488-00AA003E56F8")]
    public class InternetShortcutClass {
        // 実装やインタフェース継承は省略できる
    }

}

========== end of InternetShortcutClass.cs ==========

今日は、ComVisible 属性を省略している。
アセンブリに ComVisible(false) を明示しているからだ。

上を使えば、InternetShortcutClass は作成できるので、
一昨日のコードを書き換えて実験してみよう。

ShortcutClass を InternetShortcutClass にするだけだ。

http://mixi.jp/view_diary.pl?id=166475473&owner_id=2300658

試してみたが、インターネットショートカットの場合、
どうもリンク先が取得できないようである。

考えてみれば当然かもしれないが
インターネットショートカットが保持するのは URL なので、
常にファイル名を示す GetPath は値を返せないはずだ。

さて、どうしようか。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.