Aracılığıyla paylaş


İsim Alanında Gezinme

Artık ad alanında herhangi bir yerde gezinmek için gereken tüm temel öğelere sahipsiniz. Başlatmanın en basit yolu, masaüstü IShellFolder arabirimini almak için uygulamanızın SHGetDesktopFolderçağırmasını sağlamaktır. Ardından, ad alanında aşağı doğru gezinmek için uygulamanız şu adımları izleyebilir:

  1. Klasörün içeriğini numaralandırın.
  2. Hangi nesnelerin alt klasör olduğunu belirleyin ve birini seçin.
  3. Bu alt klasöre bağlanarak IShellFolder arabirimini alın.

Hedefe ulaşmak için bu adımları gerektiği sıklıkta yineleyin.

Ad Alanı Gezintisinin Basit Bir Örneği

Aşağıdaki örnek kod parçası, önceki bölümlerde açıklanan yordamların bir dizisini gösteren basit bir konsol uygulamasıdır. Netlik için hata denetimi atlandı. Uygulama aşağıdaki görevleri gerçekleştirir:

  1. Program Files klasörünün IShellFolder arabirimini (IShellFolder Arabirimini Kullanma) alır.
  2. Klasörün içeriğini numaralandırır (Klasör İçeriğini Numaralandırma).
  3. Tüm görünen adları belirler ve yazdırır (Görünen Adları ve Diğer Özellikleri Belirleme).
  4. Bir alt klasörü arar (Bir Alt Klasörün IShellFolder Arabirimine İşaretçi Alma).
  5. Bulduğu ilk alt klasöre bağlar (Bir Alt Klasörün IShellFolder Arabirimine İşaretçi Alma).
  6. Alt klasördeki öğelerin görüntü adlarını yazdırır.
#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;
}