Bagikan melalui


Menavigasi Namespace

Anda sekarang memiliki semua elemen penting yang diperlukan untuk menavigasi di mana saja di namespace layanan. Cara paling sederhana untuk memulai adalah dengan meminta aplikasi Anda memanggil SHGetDesktopFolder untuk mengambil antarmuka IShellFolder desktop. Kemudian, untuk menavigasi ke bawah melalui namespace layanan, aplikasi Anda dapat mengikuti langkah-langkah berikut:

  1. Hitung isi folder.
  2. Tentukan objek mana yang merupakan subfolder, dan pilih satu.
  3. Ikat ke subfolder untuk mengambil antarmuka IShellFolder-nya .

Ulangi langkah-langkah ini sesering yang diperlukan untuk mencapai target.

Contoh Sederhana Navigasi Namespace

Bagian kode sampel berikut adalah aplikasi konsol sederhana yang mengilustrasikan sejumlah prosedur yang dibahas di bagian sebelumnya. Pemeriksaan kesalahan telah dihilangkan untuk kejelasan. Aplikasi melakukan tugas-tugas berikut:

  1. Mengambil antarmuka IShellFolder folder File Program (Menggunakan Antarmuka IShellFolder).
  2. Menghitung konten folder (Menghitung Konten Folder).
  3. Menentukan semua nama tampilan dan mencetaknya (Menentukan Nama Tampilan dan Properti Lainnya).
  4. Mencari subfolder (Mendapatkan Pointer ke Antarmuka IShellFolder Subfolder).
  5. Mengikat ke subfolder pertama yang ditemukannya (Mendapatkan Pointer ke Antarmuka IShellFolder Subfolder).
  6. Mencetak nama tampilan objek dalam subfolder.
#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;
}