内部格納形式

当然ながら、ファイルによってプロパティの保存のされ方は異なる。XMPによって管理されているかもしれないし、EXIFかもしれないし、独自形式かもしれない。ただ、一般的には、プロパティといわれる物は、通常、テキスト形式であることが多い。
XML形式で格納するならば、どうにかしてテキストで保存せざるを得ない。

ところが、Windowsのプロパティは、PROPVARIANTという非常にありがたくない形式で交換される。平たく言うと、何でも入る入れ物。これを自分でテキストに変換しなさいと言われても正直困るよというぐらいの代物。

幸いというか、当然というか、Vista/XPのプロパティシステムでは、プログラマが使っても良い、任意のPROPVARIANTを文字列に変換したり、その逆をやったりする関数がやっと提供されることになった。PropVariantToStringAllocInitPropVariantFromStringだ。

一つ目の関数、PropVariantToStringAllocは、すでに上のコードで利用しているが、任意のPROPVARIANTを文字列に変換してくれる。返された領域はCoTaskMemFreeで解放する。

こっちは簡単。

不思議なのは逆方向。InitPropVariantFromStringという関数。たとえば、

2008/11/19:11:15:08.000

というテキストがあっても、本来、これをVT_LPWSTR(テキスト)として認識するか、あるいは、VT_FILETIMEとして認識するかは非常に難しい。ユーザーがどちらを望んでいるのかは分からないからだ。実際、この関数は、そこまでの処理はしてくれない。せいぜい、数値が数値として認識される程度だ。