場合によってはこれを変更したいことがあります。その両方のフォルダのアイテムを同時にExplorerBrowserへ表示できたら便利であるといえるでしょう。そこにアイテムを明示的に追加することになります。結果フォルダを作成するには、FillFromObjectを呼び出します。dwFlags);punkは、結果フォルダの初期値を与えるためのインターフェースを指定します。空の結果フォルダを作成する場合は、NULLで構いません。dwFlagsは、結果フォルダに関する定数を指定します。EBF_NODROPTARGETを指定した場合は、外部のファイルを結果フォルダにドロップできなくなります。QueryInterfaceでIResultsFolderを取得します。このインターフェースのAddIDListを呼び出します。*ppidlAdded);pidlは、追加したいアイテムのPIDLを指定します。ppidlAddedは、追加されたアイテムのPIDLを受け取る変数のアドレスを指定します。不要な場合はNULLで構いません。これは自由に変更することができます。具体的には、IFolderViewからIColumnManagerを取得してSetColumnsを呼び出します。cVisible);propkeyは、カラムを識別するPROPERTYKEYの配列を指定します。pcmciは、rgkeyOrderの要素数を指定します。IResultsFolder::AddIDListに指定するPIDLをどこから取得するかは全くの自由です。IEnumIDList::Nextで取得したそれぞれのPIDLを指定してもよいでしょう。今回は、階層をたどってアイテムを列挙するINamespaceWalkの使い方を取り上げます。*pnswcb);punkToWalkは、列挙されるアイテムを格納したインターフェースを指定します。通常は、IShellFolderを指定すると思われます。dwFlagsは、列挙に関する定数を指定します。cDepthは、列挙する階層をゼロベースで指定します。pnswcbは、列挙の経過を受け取るオブジェクトのアドレスを指定します。このオブジェクトはINamespaceWalkCBを実装している必要があります。今回のプログラムは、デスクトップから2階層の位置に存在するテキストファイルを表示します。列挙にはある程度の時間が掛かります。これはExplorerBrowserからの通知を受け取るつもりがないからです。オブジェクトのためのクラスも不要になるわけです。クラスの利用した開発を好む場合はクラスを使用しても問題ありません。BrowseToIDListで特定のフォルダの中身を表示していません。理由は、任意のアイテムをExplorerBrowserに表示するのが今回の目的だからです。アイテムの追加はAddItemsで行われます。TRUE;}INamespaceWalkを取得するには、CoCreateInstanceにCLSID_NamespaceWalkerを指定します。これが成功したらWalkを呼び出すことで、第1引数のインターフェースのアイテムを列挙することができます。第3引数が1であることから2階層まで列挙されることになります。デスクトップ直下のアイテムと、デスクトップ直下のフォルダのさらに直下のアイテムが列挙されることになります。列挙によって取得したPIDLとその数は、GetIDArrayResultから取得することができます。GetCurrentViewからIFolderViewを取得します。このIFolderViewがあれば、IColumnManagerやIResultsFolderが取得できます。PKEY_Sizeに関しては何故かファイルのサイズが表示されないようです。GetFolderでIResultsFolderを取得したら、アイテムを結果フォルダに追加するループに入ります。PathFindExtensionが返す値がテキストファイルの拡張子と一致するかを調べます。これが一致する場合は、そのアイテムのPIDLをAddIDListに指定します。AddIDListでICommDlgBrowser::IncludeObjectが呼ばれることはありません。INamespaceWalk::Walkは、第3引数に指定した階層の値が大きいほど処理に時間が掛かってしまいます。この待ち時間をできるだけ感じさせないためには、どのようにすればよいのでしょうか。ユーザーは列挙の経過を確認しながら待つことができます。列挙が終了した場合にトップレベルウインドウが最小化されてしまいます。待ち時間そのものをなくしたい場合は、NSWF_ASYNCを指定することができます。アプリケーションはINamespaceWalkCB2::WalkCompleteで列挙終了の通知を受け取ることになります。WalkCompleteでGetIDArrayResultを呼び出しても、S_FALSEが返ってPIDLを取得することができないように思えます。した事を踏まえると、単純にスレッドを作成してそこでWalkを呼び出すのが最も分かりやすいのかもしれません。