Megosztás:


Mappa azonosítójának lekérése

Ahhoz, hogy használni tudja a névtérobjektumot, meg kell határoznia azt. Ez azt jelenti, hogy megszerzi vagy az elemazonosító-listára mutató mutatót (PIDL), vagy fájlrendszer-objektumok esetében az elérési utat. Ez a szakasz az objektumazonosítók beszerzésének két egyszerűbb módját ismerteti.

A bármely mappával használható hatékonyabb megközelítés érdekében használja az IShellFolder felületet. További részletekért lásd: A mappa tartalmával kapcsolatos információk.

Az OpenFiles párbeszédpanel

Ha engedélyezni szeretné a felhasználónak a névtérben való navigálást és egy mappa kiválasztását, az alkalmazás használhatja az IFileDialog felületet. Ha ezt a felületet a FOS_PICKFOLDERS jelzővel hívja meg, a Fájlok megnyitása gyakori párbeszédpanelt indítja el "mappák kiválasztása" módban.

Windows Vista és újabb verziók esetén ez a mappák kiválasztásának ajánlott módja.

A SHBrowseForFolder párbeszédpanel

Ha engedélyezni szeretné a felhasználó számára a névtérben való navigálást és egy mappa kiválasztását, az alkalmazás egyszerűen meghívhatja SHBrowseForFolder. A függvény meghívása egy olyan felhasználói felülettel rendelkező párbeszédpanelt indít el, amely a Open vagy SaveAs gyakori párbeszédpanelekhez hasonlóan működik.

Amikor a felhasználó kiválaszt egy mappát, SHBrowseForFolder visszaadja a mappa teljes PIDL-jét és megjelenítendő nevét. Ha a mappa a fájlrendszerben található, az alkalmazás az SHGetPathFromIDListmeghívásával konvertálhatja a PIDL-t elérési útra. Az alkalmazás egy gyökérmappa megadásával korlátozhatja azt a mappatartományt is, amelyből a felhasználó választhat. Csak azok a mappák jelennek meg, amelyek a névtér gyökére alatt találhatók. Az alábbi ábrán az SHBrowseForFolder párbeszédpanel látható, amelynek gyökérmappája Program Files értékre van állítva.

a mappa tallózása párbeszédpanel képernyőképe

A shbrowseForFolderhasználatának egy egyszerű példája később érhető el.

Speciális mappák és CSIDL-ek

A rendszer számos gyakran használt mappát különlegesként jelöl meg . Ezek a mappák jól meghatározott céllal rendelkeznek, és a legtöbbjük minden rendszeren megtalálható. Még akkor is, ha eredetileg nincsenek jelen, a nevük és a helyük továbbra is meg van határozva, így később hozzáadhatók. A speciális mappák gyűjteménye magában foglalja a rendszer összes szabványos virtuális mappáját, például a Nyomtatókat, a Dokumentumok és a Hálózat környékét. Emellett számos szabványos fájlrendszermappát is tartalmaz, például a programfájlokat és a rendszert.

Annak ellenére, hogy a mappák az összes rendszer szabványos összetevői, a névtérben lévő nevük és helyük eltérő lehet. A Rendszer könyvtár például c:\Winnt\System32 egyes rendszereken, míg a C:\Windows\System32 más rendszereken. A múltban a környezeti változók lehetővé adták egy speciális mappa nevének és helyének meghatározását egy adott rendszeren. A Shell mostantól robusztusabb és rugalmasabb módot kínál a speciális mappák, CSIDLsazonosítására. Ezeket általában környezeti változók helyett érdemes használni.

A CSIDL-ek egységes módon azonosítják és azonosítják a különleges mappákat, függetlenül azok nevétől vagy helyétől egy adott rendszeren. A környezeti változókkal ellentétben a CSIDLs virtuális mappákkal és fájlrendszermappákkal is használható. Minden speciális mappához egyedi CSIDL van rendelve. A Program Files fájlrendszer mappában például CSIDL_PROGRAM_FILESCSIDL, a Network Neighborhood virtuális mappa pedig CSIDL_NETWORKCSIDL-sel rendelkezik.

A CSIDL-t több Shell-függvény egyikével együtt használjuk egy speciális mappa PIDL-jének vagy egy speciális fájlrendszermappa elérési útjának lekéréséhez. Ha a mappa nem létezik egy rendszeren, az alkalmazás kényszerítheti a létrehozását a CSIDL és a CSIDL_FLAG_CREATEkombinálásával. A CSIDL a következő függvények számára továbbítható:

Vegye figyelembe, hogy ez a két függvény a Shell 5.0-s verziójával lett bevezetve, és felváltotta a SHGetSpecialFolderLocation és SHGetSpecialFolderPath függvényeket.

Egyszerű példa a CSIDLs és az SHBrowseForFolder használatára

Az alábbi mintafüggvény, a PidlBrowse bemutatja, hogyan használhatja a CSIDL-eket egy mappa PIDL-jének lekérésére, és hogyan használhatja SHBrowseForFolder, hogy a felhasználó kijelöljön egy mappát. Visszaadja a kijelölt mappa PIDL-jét és megjelenítendő nevét.

LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};

    if(nCSIDL)
    {
        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
    }

    else
    {
        pidlRoot = NULL;
    }

    bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose a folder";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0;

    pidlSelected = SHBrowseForFolder(&bi);

    if(pidlRoot)
    {
        CoTaskMemFree(pidlRoot);
    }

    return pidlSelected;
}

A hívó alkalmazás egy ablakfogóponton halad át, amelyre SHBrowseForFoldervan szükség. Az nCSIDL paraméter egy nem kötelező CSIDL, amely gyökérmappát ad meg. Csak a hierarchia gyökérmappája alatti mappák jelennek meg. A korábban bemutatott ábra úgy jött létre, hogy meghívja ezt a függvényt nCSIDLCSIDL_PROGRAM_FILESértékre. A hívó alkalmazás egy sztringpufferben (pszDisplayName) is áthalad, hogy a PidlBrowse visszatérésekor tartsa a kijelölt mappa megjelenítendő nevét. A hívó alkalmazás felelőssége, hogy felszabadítsa SHBrowseForFolder által visszaadott IDList-et CoTaskMemFreehasználatával.