INamespaceWalk
COM公式ドキュメント
指定したルートノードから名前空間をたどるメソッドを公開します。たどる深さを指定でき、たどったすべてのノードのIDを格納した配列を任意で返します。
解説(Remarks)
名前空間の内容を表示したり、その内容に対して操作を実行したりするには、このインターフェイスを使用します。INamespaceWalk を使用すると、名前空間内で到達可能なすべてのノードを項目識別子リストへのポインター(PIDL)として取得でき、それらを用いて各ノードの IShellFolder オブジェクトを取得できます。
INamespaceWalk の既定の実装のクラス識別子(CLSID)は CLSID_NamespaceWalker です。INamespaceWalk オブジェクトは、CoCreateInstance を使用して CLSID_NamespaceWalker に関連付けられたクラスの未初期化オブジェクトを1つ作成することで取得できます。このインターフェイスのIIDは IID_INamespaceWalk です。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定したルートから指定した深さまで、名前空間の再帰的なたどりを開始します。
| punkToWalk | IUnknown* | in | たどりを開始するルートノードです。これは次のいずれかのオブジェクトで表すことができます。 デスクトップの IShellFolder をルートとして指定すると、cDepth が十分に大きい場合には Windows 名前空間全体をたどることも可能です。 |
| dwFlags | DWORD | in | たどりの動作を制御する次のフラグの1つ以上を指定します。 NSWF_DEFAULT (0x00000000) 他のフラグをいずれも設定したくない場合に、この値を使用します。 NSWF_NONE_IMPLIES_ALL (0x00000001) 次の両方の条件を満たす場合、フォルダー内のすべての項目を収集します。
NSWF_ONE_IMPLIES_ALL (0x00000002) 次の両方の条件を満たす場合、フォルダー内のすべての項目を収集します。
NSWF_DONT_TRAVERSE_LINKS (0x00000004) 再帰の際にリンク(.lnk、.url、およびフォルダーショートカット)をたどりません。代わりに、それらを通常の項目として返します。 NSWF_DONT_ACCUMULATE_RESULT (0x00000008) 名前空間のたどり中にノードのPIDLを収集しません。 NSWF_TRAVERSE_STREAM_JUNCTIONS (0x00000010) ストリームジャンクションポイントの内容もたどりに含めます。たとえば、.cab ファイルの内容の中に入ってたどります。 NSWF_FILESYSTEM_ONLY (0x00000020) ファイルシステムのノードのみをたどります。 NSWF_SHOW_PROGRESS (0x00000040) 名前空間をたどる間、プログレスバー付きのダイアログボックスを表示します。 NSWF_FLAG_VIEWORDER (0x00000080) 項目を表示順で返します。これは punkToWalk が IShellView オブジェクトである場合にのみ適用されます。 NSWF_IGNORE_AUTOPLAY_HIDA (0x00000100) データオブジェクト内の自動再生用 HIDA を使用しません。これは punkToWalk が IDataObject オブジェクトである場合にのみ適用されます。 NSWF_ASYNC (0x00000200) バックグラウンドスレッドで実行することにより、たどりを非同期に行います。 NSWF_DONT_RESOLVE_LINKS (0x00000400) リンク(.lnk、.url、およびフォルダーショートカット)をたどってそのターゲットを返しますが、それらのターゲットが存在するかどうかは検証しません(Resolve)。これは最適化であり、見つからないか移動されたターゲットを検出して返せる場合を除き、結果には影響しません。 NSWF_ACCUMULATE_FOLDERS (0x00000800) NSWF_DONT_SORT (0x00001000) たどる項目の並べ替え順を維持しません。 NSWF_USE_TRANSFER_MEDIUM (0x00002000) NSWF_DONT_TRAVERSE_STREAM_JUNCTIONS (0x00004000) NSWF_ANY_IMPLIES_ALL (0x00008000) Windows 8 で導入されました。 |
| cDepth | INT | in | 名前空間階層をたどる最大の深さです。この深さは0から始まります。0 に設定すると、punkToWalk で指定したフォルダーのみをたどり、そのサブフォルダーはたどりません。 |
| pnswcb | INamespaceWalkCB* | in | INamespaceWalk が使用する INamespaceWalkCB コールバック関数です。このパラメーターは NULL でもかまいません。このオブジェクトは任意で INamespaceWalkCB2 および IActionProgress インターフェイスを実装できます。後述の解説を参照してください。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
NSWF_SHOW_PROGRESS フラグを渡さず、かつ pnswcb パラメーターが指すオブジェクトが IActionProgress を実装している場合、INamespaceWalk::Walk メソッドは、操作をキャンセルすべきかどうかを判断するために IActionProgress::QueryCancel メソッドを定期的に呼び出します。
INamespaceWalk::Walk によって開始された名前空間のたどりで見つかったオブジェクトの一覧を取得します。
| pcItems | DWORD* | out | pppidl に格納されている項目の数です。 |
| prgpidl | ITEMIDLIST*** | out | 名前空間のたどりで見つかった項目を表すPIDLの配列へのポインターのアドレスです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
INamespaceWalk::GetIDArrayResult を使用するには、INamespaceWalk::Walk の呼び出しで NSWF_DONT_ACCUMULATE_RESULT を指定できません。
この配列を解放するのは呼び出し元アプリケーションの責任です。各PIDLに対して、および配列自体に対して1回、CoTaskMemFree を呼び出してください。
例
次の例では、INamespaceWalk インスタンスを作成し、デスクトップからたどりを開始して、デスクトップフォルダーとその直下の子のみをたどり、たどりで取得したPIDLを取得し、その配列を解放します。
void NamespaceWalk_Example()
{
// Note that error checking has been omitted for clarity.
INamespaceWalk *pnsw = NULL;
IShellFolder *psfDesktop = NULL;
// Get a pointer to the desktop to use as our root node
hr = SHGetDesktopFolder(&psfDesktop);
// Create the INamespaceWalk instance
hr = CoCreateInstance(CLSID_NamespaceWalker,
NULL,
CLSCTX_INPROC,
IID_INamespaceWalk,
(void **)&pnsw);
// Walk the desktop folder and one level of subfolders
hr = pnsw->Walk(psfDesktop, NSWF_NONE_IMPLIES_ALL, 1, NULL);
UINT cItems;
PIDLIST_ABSOLUTE *ppidls;
// Retrieve the array of PIDLs gathered in the walk
hr = pnsw->GetIDArrayResult(&cItems, &ppidls);
// Perform some action using the PIDLs
// The calling function is responsible for freeing the PIDL array
FreeIDListArrayFull(ppidls, cItems);
return;
}
void FreeIDListArrayFull(PIDLIST_ABSOLUTE *ppidls, UINT cItems)
{
// Free the array elements
for (UINT i = 0; i < cItems; i++)
{
CoTaskMemFree(ppidls[i]);
}
// Free the array itself
CoTaskMemFree(ppidls);
return;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_INamespaceWalk "{57CED8A7-3F4A-432C-9350-30F24483F74F}" #usecom global INamespaceWalk IID_INamespaceWalk "{}" #comfunc global INamespaceWalk_Walk 3 sptr,int,int,sptr #comfunc global INamespaceWalk_GetIDArrayResult 4 var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_INamespaceWalk "{57CED8A7-3F4A-432C-9350-30F24483F74F}" #usecom global INamespaceWalk IID_INamespaceWalk "{}" #comfunc global INamespaceWalk_Walk 3 sptr,int,int,sptr #comfunc global INamespaceWalk_GetIDArrayResult 4 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。