Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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.
- OpenFiles párbeszédpanel
- SHBrowseForFolder párbeszédpanel
- Speciális mappák és CSIDL-ek
- Egy egyszerű példa a CSIDL-ek és az SHBrowseForFolder használatára
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 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ó:
- SHGetFolderLocation, amely egy speciális mappa PIDL-ját kéri le.
- SHGetFolderPath, amely lekéri egy speciális fájlrendszerbeli mappa elérési útját.
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.