TRUE;}この関数は、フォルダを示すアイテムIDを引数に渡すと、そのフォルダ内のファイルがデバッグ用アウトプットにバンバン出力されるというものです。NULLを渡すとデスクトップのファイルを出力します。その内容を見ていきましょう。フォルダのバインドフォルダのアイテムIDを取得したら、それをIShellFolderに結びつけます。結びつけたそのIShellFolderインターフェイスから、ファイルリストを取得することができます。結びつけるにはIShellFolder::BindToObject()メソッドを使用します。注意して欲しいのはBindToObject()メソッドを呼び出したインターフェイスにバインドされるわけではないということです。呼び出したインターフェイス(例ではデスクトップフォルダ)はあくまでバインドの手助けをするだけです。バインドされたIShellFolderは第4引数に返ってきます。このインターフェイスをこれから使うわけです。ちなみにこのインターフェイスも動的に作製された形なので、あとでRelease()メソッドを使って解放する必要があります。ちなみに、例を見ると奇妙な形だということに気付くと思います。第3引数に返すインターフェイスのタイプ、第4引数に受け取るためのポインタを渡します。いう形はインターフェイスでは結構出てくるので見慣れておきましょう。こんな風な形で、いろんなインターフェイスを取得することができるというわけです。ちなみに、このメソッドの場合にはIShellFolderしか取得できません(汗)。IEnumIDListの取得バインドが成功したら、バインドしたIShellFolderからIEnumIDListインターフェイスを取得します。このインターフェイスから、ファイルのアイテムIDを取得します。「また新しいインターフェイスが出てきたぁ!!」と思うかもしれませんが、IEnumIDListは別に難しいこともないので気にすることはないでしょう。IEnumIDListの取得にはIShellFolder::EnumObjects()というメソッドを使用します。第2引数には取得するファイルのタイプを指定できますが、フォルダ、それ以外、隠しファイルのみっつしか選べないのであんまり気にしなくていいです(例ではすべて設定しています)。IEnumIDListは第3引数に返ってきます。アイテムIDリストの取得ファイルを示すアイテムIDはIEnumIDList::Next()メソッドを使用して取得します。IEnumIDListはCListクラスに似たインターフェイスで、アイテムIDを次々と取得していくことができます。第1引数には一度に取得するアイテムIDの数を入れます。第3引数には受け取った数が入ります。今回はひとつずつ取得するので1とNULLを入れています。第2引数でアイテムIDを受け取ります。全部アイテムIDを取得するとS_FALSEが返ってくるんで、それまでループで取得していけばOKです。これまで通り、ここで取得するアイテムIDも後で解放しなければなりません。アイテムIDの解放にはIMalloc::Free()メソッドを使用します。ちなみに、IEnumIDList::Next()メソッドのヘルプを見てみると、引数が4つあることに気付くと思います。これは注意が必要です。引数が3つでいいのはC++だからです。C言語の場合には4つ必要で、第1引数に呼び出しているIEnumIDListインターフェイスを渡します。これはおそらく、C++ではインターフェイスをクラスで実現しているため呼び出し元のデータ(つまりプライベートなメンバ変数)を直接使用できるが、C言語では単に関数を呼び出しているだけなのでムリ、ということではないでしょうか(よく知らんですはい)。別にC++だけで作るんだからいいんですが、サンプルがC言語だったりすることがあるんでそういうときには注意しましょう。いうのはメソッドによって違います。ファイルパスの取得さて、アイテムIDは取得できました。このままでも色々と使えるんですが、やっぱりちゃんと文字として見れないとなんか落ち着きませんよね。いうわけで、ファイルのパスを取得しましょう。パスの取得にはIShellFolder::GetDisplayNameOf()を使用します。IShellFolderのメソッドを使用することに注意してください。実際、アイテムIDに対して行いたいことがあっても、それがどのインターフェイスのどのメソッド(もしくはAPI)を使用すればいいのか分からないことが多々あります。今回の企画を読めばそれが分かるわけですねー、便利な世の中ですねー(汗)。第2引数には取得するファイル名のタイプを指定します。SHGDN_NORMALでファイル名だけ、SHGDN_FORPARSINGだとフルパスを取得することができます。実際にはそう単純じゃないみたいです。詳しくはSHGNOのリファレンスを参照してください。このメソッドを使用して取得できたのはSTRRET構造体です。文字列ではないので、変換する必要があります。変換する関数は次のようなものです。cRetStr;}なんでこれで変換できるのか、筆者には理解できないのでこれはまぁそのまま使ってください(汗)。ここまで来ればビルドしちゃってOKです。任意のフォルダを渡すようにすれば、そのフォルダの中にあるファイルを列挙できるはずです。これだけじゃまだダメ!さて、実際に試してみるとそれなりに感動すると思いますが、実はこれだけではまだ不十分です!!。パスの取得にIShellFolder::GetDisplayNameOf()ではなく、フォルダを選択するダイアログ(前編)の中で紹介したSHGetPathFromIDList()というAPIを使用してファイルパスを取得してみると、不正なパスが返ってくることでしょう(おそらく「システムフォルダ+ファイル名」でしょう。C:\Windows\system\index.htmlとか)。ここからサブフォルダに移動しようとか考えてIShellFolder::BindToObject()でバインドしようとしても、見事に失敗します。そこで、次回は「ITEMIDLISTとはなんぞね!?」と題してアイテムIDのその人となりに迫ってみましょう。これからの予定として「ファイルの実行」「コンテキストメニューの表示」「ゴミ箱への削除」「アイコンの取得」「ショートカットの操作」といったものを予定しています。