次の方法で共有


名前空間のナビゲーション

これで、名前空間内の任意の場所を移動するために必要なすべての重要な要素が作成されました。 最も簡単な開始方法は、SHGetDesktopFolderアプリケーションを呼び出して、デスクトップの IShellFolder インターフェイスを取得することです。 次に、名前空間を下方向に移動するには、アプリケーションで次の手順に従います。

  1. フォルダーの内容を列挙します。
  2. サブフォルダーであるオブジェクトを決定し、1 つ選択します。
  3. サブフォルダーにバインドして、IShellFolder インターフェイスを取得します。

ターゲットに到達するには、必要な頻度でこれらの手順を繰り返します。

名前空間ナビゲーションの簡単な例

次のサンプル コードは、前のセクションで説明した手順の数を示す単純なコンソール アプリケーションです。 わかりやすくするために、エラー チェックは省略されています。 アプリケーションは、次のタスクを実行します。

  1. Program Files フォルダーの IShellFolder インターフェイス (IShellFolder インターフェイスを使用した) を取得します。
  2. フォルダーの内容を列挙します (フォルダーの内容を列挙します)。
  3. すべての表示名を決定し、それらを出力します (表示名とその他のプロパティを決定します)。
  4. サブフォルダーを探します (サブフォルダーの IShellFolder インターフェイスへのポインターの取得)。
  5. 見つけた最初のサブフォルダーにバインドします (サブフォルダーの IShellFolder インターフェイスへのポインターの取得)。
  6. サブフォルダー内のオブジェクトの表示名を出力します。
#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;
}