2006 年 7 月 5 日 19 時 23 分

インターネットショートカットを読む


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


では、インターネットショートカットを読んでみよう。

まずは、適当なショートカットを用意する。
例えば、Google をお気に入りに入れたとすると、
「Google.url」というファイルが、
C:\Documents and Settings\<user>\Favorites\ にできる。

以前の、通常のショートカットを読み込む
テスト用のコードを書き換えれば速そうだ。

例によって、プロジェクトのプロパティより、
出力の種類を「コンソール アプリケーション」にしておく。

========== Test.cs ==========

using System;
using System.Text;
using System.Diagnostics;
using LoaferShellEx.Interop;
using System.Runtime.InteropServices;

namespace LoaferShellEx {

    internal class Test {

        [STAThread]
        static public void Main() {

            const string path =
                    "(省略)\\Favorites\\Google.url";

            // Internet Shortcut オブジェクトを作成
            InternetShortcutClass obj =
                    new InternetShortcutClass();

            try {

                // IPersistFile インタフェースを取得し
                UCOMIPersistFile pf = (UCOMIPersistFile)obj;

                // ショートカットファイルを読み込み
                pf.Load(path, 0);

                // IUniformResourceLocatorW インタフェースを取得する
                IUniformResourceLocatorW link =
                        (IUniformResourceLocatorW)obj;

                // 変数を用意(バッファ確保は不要)
                string url;

                // URL を得る(メソッドが割り当て⇒自動解放)
                link.GetURL(out url);

                // デバッグ出力
                Debug.WriteLine(url.ToString());

            } finally {

                // COM オブジェクトを解放する
                Marshal.ReleaseComObject(obj);

            }

        }

    }

}

========== end of Test.cs ==========

通常のショートカットの読み込みと殆ど変わらない。
IPersistFile を使ってファイルを読み込むのも同じだ。

IShellLinkW では失敗したので、
IUniformResourceLocatorW にキャストし、
GetURL を呼び出すことで URL を取得する。
.NET のお陰で非常にシンプルなコードになっている。

実行してみよう。

http://www.google.co.jp/

成功のようだ。

メソッド側が文字列を割り当てるのは、
バッファの長さを考えなくてもいいという利点もある。
なので、Bookmarklet のような長めの URL でも取得できる。

path = "(省略)\\mixi Whitespace Filter for Diary.url";

試してみる。

javascript:void%28document.forms%5B0%5D.elements%5B%22diary_body%22%5D.value%3Ddocument.forms%5B0%5D.elements%5B%22diary_body%22%5D.value.replace%28%2F%5CxA0%2Fg%2C%22%20%22%29.replace%28%2F%26%2Fg%2C%22%26amp%3B%22%29.replace%28%2F%5Cx20%5Cx20%2Fg%2C%22%26nbsp%3B%20%22%29%29%3B

MAX_PATH を超える文字数だが、URL は読み込めている。



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