このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
次に行う作業は、表示させるアイコンの作成である。
今回は、以下の 3 種類のアイコンを表示させる予定である。
・ハードリンク
・マウントポイント(ボリューム・ジャンクション)
・フォルダリンク(シェルのフォルダショートカット)
残念ながら、デザインをする腕は持ち合わせてないので、
シェルが元々持っているショートカットアイコンに、
色をつけて適当に捏造することにする。
アイコンは、独立したファイルとして使うこともできるが、
DLL のリソースとして含めることもできる。
IShellIconOverlayIdentifier はどちらでも構わないが、
よりスマートな、DLL のリソースの方を選ぶことにしよう。
プロジェクトで「リソースの追加」を選ぶと、
自動的に LinkIconOverlays.rc というファイルが追加され、
編集可能となるので、そこにアイコン 3 つ新規で追加する。
アイコンは、複数のサイズや解像度の画像を持てる。
大した色数は使ってないので、色は 16 色で十分だが、
Windows XP 以降は、48 x 48 のサイズが標準なので、
16 x 16, 32 x 32, 48 x 48 の 3 つのサイズを用意しよう。
つまり、全部で 9 個の絵を描くことになる。
感覚的に、ハードリンクを青、マウントポイントを赤、
そしてフォルダリンクを緑にでもしておこうか。
アイコンができたら、それぞれに ID を振る。
今回は以下のように識別子を与えることにする。
・IDI_HARDLINK
・IDI_MOUNTPOINT
・IDI_FOLDERLINK
ここでつけた識別子はリソース専用の resource.h という
ヘッダファイルに、マクロによって数値で定義されている。
自動生成された resource.h を覗いてみると、
以下のように記載されているはずだ。
#define IDI_HARDLINK 101
#define IDI_MOUNTPOINT 102
#define IDI_FOLDERLINK 103
数値は環境や操作によっても違う可能性はあるが
このファイルはリソース編集時に自動的に同期され、
リソースがコンパイルされるときにも利用される。
他のソースファイルで resource.h を取り込んでおけば、
リソース ID をマクロ定数として使えると言うわけだ。
さて、明日はアイコンの COM クラスの実装を行おう。
ところで、テキストのソースならば日記にも書けるが、
アイコンファイルのようにバイナリを届けるにはどうするか。
とりあえず作成したアイコンを CAB で圧縮して、
それに BASE64 をかけたものを書いておこう。
========== icons.cab.b64 ==========
TVNDRgAAAAB2AgAAAAAAADgAAAAAAAAAAwEBAAMABAAoEQAACA
AAAAAAAAAAAAAAkwAAAAEAAQCuCgAAAAAAAAAAcjXVbCAATW91
bnRQb2ludC5pY28ArgoAAK4KAAAAAHI1Cm0gAEZvbGRlckxpbm
suaWNvAK4KAABcFQAAAAByNRNqIABIYXJkTGluay5pY28A+GEh
ZdsBCiBDS+1YO27DMAxlPujsXqA1NGVzpswZgq65Qscew9fQ5K
v4AAZ8jc7aDBhQxUitQ5VK4tYpkoLPVhg+2hQl0wwRgBksIM8z
QLzPATZOZpnXVzOApwXAeu31tweAl6Xj3ffcjS3g/cuDDebwhS
wMj/JwQll6gYf7Ute1k8jYwwnWeoEHUu7jETE4gmdHWqJrqnfV
GV130f2a6p0+bafzx/EJJobb8EvHNbAKeZwf5XkJV8nzLCzXyy
pIXWUhj4l96qyb2fSwFwzcp7Ubr8f7tLxSPWDWHh4/w3cJXvM8
1otRvE7zFTuv5vlOa5a3Kb7T4/ywcab2UyAQsIUSy9CfS//6ir
ztblUh8sFvgUETXVHdFGd0ZaL7FdWNOm2n88fxCf5/t1ong/1V
nuchv7wsglRFHvKY2KfOunvpVpXi37jCPy6GNwle8bwpRvIqzR
fsvIrnjVIsb1O8UeP8sHGm9lMgEEi3Kt3qmF+nHWI7+N1j0Md6
00R6G9tborcOxJ+7gPqP9D62E/9xfAL5b/WHeb4N+eVlE2TI1n
3fEvvUWXcv3epux79xe/+4vvMNFgiWtyP5qLJ81pO+bXje9rZl
4sTrOd42tBIN6+rH8X3KD7eu1H4KBALpVm+tW/0A
========== end of icons.cab.b64 ==========
このままでは解読できないと困るんで、
base64 を解除するスクリプトも付けておこう。
========== unbase64.js ==========
var path = WScript.Arguments(0);
var s = new ActiveXObject("ADODB.Stream");
s.Charset="UTF-8";
s.Open();
s.LoadFromFile(path);
var b64 = s.ReadText();
s.Close();
var d = new ActiveXObject("Microsoft.XMLDOM");
var e = d.createElement("X");
e.text = b64;
e.dataType = "bin.base64";
var data = e.nodeTypedValue;
s.Type = 1; // binary
s.Open();
s.Write(data);
s.SaveToFile(path.replace(/\.b64$/, ""), 1);
s.Close();
========== end of unbase64.js ==========
icons.cab.b64 を unbase64.js にドロップすると、
icons.cab ができるはずである。
cab は Windows 標準機能で開けるのだが、
base64 の展開が標準では無理なので悩ましいところだ。
これは、uuencode や ISH、binhex にも当てはまる。
EML という手もあるが、Outlook Express を使ってない場合、
いちいちウィザードが起動するのはやってられない。
また、それに似た MHT で送るという手もあるが、
ファイルの添付が無視されるので余計な手間が掛かり、
拡張子が無視されたりちゃんと開けなかったりと難しい。
PDF という有力な手もあるが(PDF はテキストで書ける)
mixi 日記の HTML は Internet Explorer でコピーした場合、
毎行末に空白が含まれるが、Firefox では含まれない。
PDF はバイト数に厳格なので、これでは厄介だ。
(HTML の空白の解釈の違いによる問題ではあるのだが)
困ったもんだ。