ここで書いたIDataObjectの形式ですが、urn:qmail://<account>/<folder-path>/<uid-validity>/<id>という形式にしてみました。URN形式にしたのはそのうち他のところで役に立たないかなと思ったので。目下のところ、内部のデータ形式としてしか使われないので表に出ることはないと思いますが。
上の変更をしたのでQMAILを一旦終了してもクリップボード内にデータを保持できるようになりました。このため、終了時にはOleFlushClipboardを呼び出して、IDataObjectの中身をクリップボード内にレンダリングするようにしました。MSDNによると、OleIsCurrentClipboardを呼び出して、先にセットしたIDataObjectがまだクリップボードに残っているかどうかを調べるようにとなっていますが、そうするとセットしたIDataObjectを保持しておかなくてはならなくていまいちです。なので、クリップボードからIDataObjectを取り出して独自形式のFORMATETCがセットされているかどうかを調べて、セットされていたらフラッシュするようにしました。
IDataObjectにこれらのフォーマットのサポートも加えました。これで、リストビューからエクスプローラにDnDしてエクスポートができることになります。
後はファイル名をどうするかを決めなくてはいけません。一意にしやすいという意味からするとMessage-Idが良いのですが、ファイルの中身がわかりにくいですよね。Subjectにするのがわかりやすさ的には良さそうです。同じSubjectの時には適当に連番をつけるということで。拡張子はやはりemlにするべき?
もう一つは移動やリンクの操作をされた場合にどうするかですね。DnDの場合にはドラッグ元で検出できますが、クリップボード経由の場合にはちょっと仕掛けを使う必要がありそうです。それをやったとしても、QMAILが終了してからPasteされたらどうしようもないですし。
一つ疑問なのは、なぜかFILEGROUPDESCRIPTORの先頭で指定したFILEDESCRIPTORのファイルだけ上書き確認がなされないことです。他のファイルの場合、同じ名前のファイルがあるとエクスプローラが上書き確認のダイアログを出すのですが、なぜか最初のファイルだけ出ません。さらにいうと、上書き確認ダイアログでのアイコンもWindowsデフォルトのものが出てしまい、関連付けされたアイコンが出ません。この辺は、OEあたりから自アプリにドロップしてみて中身を調べるのが一番手っ取り早いかも。
FILEDESCRIPTORで指定するファイル名は重複しているとシェル側で連番を振ってくれるようです。さらに、ファイル名として使えない文字が入っていると自動的にその文字を削除してくれます。なので、長さだけに気をつけてSubjectをファイル名にしておけば後はシェルが面倒を見てくれそうです。
ファイル名が自動的に置き換わるのは完全ではないようで、':'が含まれているとエラーになりますね。なので、生成する側で置き換えることにしました。"\/:*?<>|"は'_'に置き換えます。
上書き時に確認ダイアログが出ないのとアイコンが正しく出ないのは何が原因か不明です。OEからドロップしたデータを見てみてもQMAILで生成しているデータと変わりないですし。しかも、別の環境だと二つ目以降のファイルでもダイアログが出ないようです(でもその環境だとOEでもダイアログが出ません)。シェルのバージョンも同じはずなんですが、一体どうなっているんでしょう。