このアーカイブは同期化されません。 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 のお陰で非常にシンプルなコードになっている。
実行してみよう。
成功のようだ。
メソッド側が文字列を割り当てるのは、
バッファの長さを考えなくてもいいという利点もある。
なので、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 は読み込めている。