名前空間内を移動する
これで、名前空間内の任意の場所を移動するために必要なすべての重要な要素が用意されました。 最も簡単な開始方法は、アプリケーションで SHGetDesktopFolder を呼び出して、デスクトップの IShellFolder インターフェイスを取得することです。 次に、名前空間内を下方向に移動するには、アプリケーションで次の手順に従います。
- フォルダーの内容を列挙します。
- サブフォルダーであるオブジェクトを決定し、1 つを選択します。
- サブフォルダーにバインドして、 その IShellFolder インターフェイスを取得します。
ターゲットに到達するには、必要な頻度でこれらの手順を繰り返します。
名前空間ナビゲーションの簡単な例
次のサンプル コードは、前のセクションで説明したいくつかの手順を示す単純なコンソール アプリケーションです。 わかりやすくするためにエラー チェックが省略されました。 このアプリケーションは、以下のタスクを実行します。
- Program Files フォルダーの IShellFolder インターフェイスを取得します (IShellFolder インターフェイスを使用)。
- フォルダーの内容を列挙します (フォルダーの内容の列挙)。
- すべての表示名を決定し、それらを出力します (表示名とその他のプロパティの決定)。
- サブフォルダーを検索します (サブフォルダーの IShellFolder インターフェイスへのポインターの取得)。
- 見つかった最初のサブフォルダーにバインドします (サブフォルダーの IShellFolder インターフェイスへのポインターの取得)。
- サブフォルダー内のオブジェクトの表示名を出力します。
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>
main()
{
LPITEMIDLIST pidlProgFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfFirstFolder = NULL;
IShellFolder *psfDeskTop = NULL;
IShellFolder *psfProgFiles = NULL;
LPENUMIDLIST ppenum = NULL;
ULONG celtFetched;
HRESULT hr;
STRRET strDispName;
TCHAR pszDisplayName[MAX_PATH];
ULONG uAttr;
CoInitialize( NULL );
hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, 0, &pidlProgFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
psfDeskTop->Release();
hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
if(!psfFirstFolder)
{
uAttr = SFGAO_FOLDER;
psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
if(uAttr & SFGAO_FOLDER)
{
hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
}
}
CoTaskMemFree(pidlItems);
}
cout << "\n\n";
ppenum->Release();
if(psfFirstFolder)
{
hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
CoTaskMemFree(pidlItems);
}
}
ppenum->Release();
CoTaskMemFree(pidlProgFiles);
psfProgFiles->Release();
psfFirstFolder->Release();
CoUninitialize();
return 0;
}