Kódtárak használata a programban
Ez a témakör a kódtárak programbeli használata során megfontolandó szempontokat ismerteti.
Ebben a témakörben:
- Kódtár programozásának áttekintése
- programozás könyvtárakkal
- Közös fájl párbeszédpanel használata tárakkal
- A tár kiválasztásának engedélyezése a felhasználói felületről
- Kódtár tartalmának elérése egy programban
- Felhasználói tartalom mentése könyvtárban
- Húzás és ejtés műveletek támogatása egy könyvtárban
- Szinkronban maradni egy könyvtárral
- Kapcsolódó témakörök
A kódtár programozásának áttekintése
A kódtárak lehetővé teszik a felhasználók számára, hogy a számukra fontos és a fájlrendszer szervezete által nem korlátozott módon rendszerezzék a fájlalapú tartalmakat. Amikor a program támogatja a kódtárakat, lehetővé teszi a felhasználó számára, hogy a tartalmakat olyan módon keresse meg, amely érthető a számukra, miközben a Windows 7 felhasználói felületének megfelelő felhasználói felületet mutat be. A kódtárak megkönnyítik a program számára a különböző mappákban vagy különböző gépeken tárolt fájlalapú tartalmak megkeresését is.
Az ebben a szakaszban található témakörök azt ismertetik, hogyan adhat hozzá kódtár-támogatást a programhoz, és hogyan használhatja ki a kódtárak által kínált új képességeket. A Windows 7 alapértelmezés szerint biztosít néhányat ebből a támogatásból. Ha a program nem módosítja a jelenleg használt gyakori fájl párbeszédpaneleket, előfordulhat, hogy a kódtárak támogatásához nagyon kevés további program szükséges.
Ez a szakasz ismerteti a kódtárak által biztosított főbb funkciókat, és azt, hogyan támogathatja őket a programban. Ezzel az információval eldöntheti, hogy mely funkciók biztosítják a legjobb felhasználói élményt a programból. Ha a program testre szabja a közös fájl párbeszédpaneleket, az ebben a szakaszban található információk segítenek meghatározni, hogyan használhatja az új közös fájl párbeszédpaneleket kódtárak használatára, és hogyan biztosíthat egyenértékű funkciókat a Windows 7-ben.
Programozás kódtárakkal
A Windows Shell programozási modell azt ismerteti, hogy egy program hogyan kommunikál a Windows Shell programozási objektumaival. Míg a fájlrendszer-objektumokat, például a fájlokat és könyvtárakat Windows Shell-objektumok képviselik, nem minden Windows Shell-objektumot a fájlrendszer. A kódtárak például olyan Windows Shell-objektumok, amelyek nem rendelkeznek a fájlrendszer megfelelőivel. A Windows Shell-objektumok a programban való használata lehetővé teszi, hogy a program ne csak a fájlrendszerbeli objektumokhoz, hanem az összes Shell-objektumhoz hozzáférjen.
A legjobb eredmény érdekében a program a Shell Library API-t használná a kódtárak használatához és a tartalmak eléréséhez. Bár a tárak fájlrendszerelemeket, például mappákat és fájlokat tartalmaznak, a tárak nem fájlrendszerelemek. Ezért a fájlrendszer API-k nem használhatók a könyvtárfunkciók és a tár tartalmának eléréséhez.
Ha már rendelkezik olyan programmal, amely jelenleg sok fájlrendszerbeli API-t használ, a program továbbra is kihasználhatja a kódtár funkcióit. A Shell Library API fájlrendszer-hivatkozásokat biztosíthat a tárban található elemekre, és ezek a fájlrendszerbeli hivatkozások, például a fájlnév és az elérési út átadhatók a meglévő fájlrendszer API-knak, amelyek a meglévő programban találhatók.
Átállás az ismert mappákról a könyvtárakra
A Windows 7 előtt gyakran használtunk egy ismert mappát, például a Dokumentumok mappát a fájlmentési vagy fájlmegnyitási műveletek alapértelmezett mappájaként. A Windows 7-ben a megfelelő kódtárat kell használni, hogy a felhasználó ugyanazzal a tapasztalattal rendelkezzen a programban, mint más Windows 7-programokban, például a Windows Explorerben.
Ha jelenleg a Windows Shell API-t használja a programban, a kódtár támogatása egyszerű. Ha például jelenleg a SHGetKnownFolderItem függvényt hívja meg a Dokumentumok mappa helyének lekéréséhez, a ISMERTFOLDERID ismert mappa értékét lecserélheti a megfelelő tár ISMERTFOLDERID értékére.
Az alábbi táblázat a ISMERTFOLDERID ismert mappák értékei és a Windows 7-ben található megfelelő könyvtár KNOWNFOLDERID értéke közötti kapcsolatot mutatja be.
Ismert mappa KNOWNFOLDERID értékei | Könyvtár ISMERTFOLDERID értékei |
---|---|
FOLDERID_Documents | FOLDERID_TárgyakKönyvtára |
FOLDERID_Pictures | FOLDERID_PicturesLibrary |
FOLDERID_Music | FOLDERID_MusicLibrary |
FOLDERID_RögzítettTV | FOLDERID_FelvettTVKönyvtár |
HomeGroup és megosztott kódtárak
Ha hozzáadja a könyvtártámogatást a programhoz, az lehetővé teszi a megosztott kódtárak támogatását a HomeGroupban. A HomeGroupot a KNOWNFOLDERIDFOLDERID_HomeGroupértéke azonosítja. A program a IShellLibrary:GetDefaultSaveFolder metódus meghívásában a DEFAULTSAVEFOLDERTYPE értékének beállításával azonosíthatja a felhasználó privát vagy megosztott alapértelmezett mentési helyét.
Közös fájlpárbeszédablak használata könyvtárakkal
Közös fájl párbeszédpanel használata kódtárakkal A közös fájl párbeszédpanel frissítve lett a Windows 7-tárak támogatásához. Az alábbi ábra bemutatja, hogyan jelenik meg a közös fájl párbeszédpanel egy felhasználó számára a Windows 7-ben.
Windows 7 rendszerben, ha a program jelenleg egy közös fájl párbeszédpanelt jelenít meg, és nem módosítja a párbeszédpanel-sablont, vagy nem kapcsol be egyik eseményét sem, automatikusan megjeleníti a párbeszédpanel új Windows 7 verzióját. A közös fájl párbeszédpanelfüggvény hívásában az lpfnHook, hInstance, lpTemplatename az OPENFILENAME struktúrájának NULL és a OFN_ENABLEHOOK és OFN_ENABLETEMPLATE jelzőknek egyértelműnek kell lenniük.
A Windows 7-ben a IFileDialog-kapcsolódó interfészek helyettesítik a Windows korábbi verzióiban használatos gyakori fájl párbeszédpanel-függvényeket. A korábbi gyakori fájl párbeszédpanel-függvények továbbra is támogatottak a Windows 7-ben, de nem biztosítják a Teljes Windows 7 felhasználói élményt, és nem támogatják a kódtárakat. Az IFileDialog-hez kapcsolódó felületek által támogatott új funkciók közé tartoznak a következők:
- A felhasználó hozzáférhet a Windows 7 Windows Intéző által támogatott fájltulajdonságokhoz a fájlok kereséséhez és kiválasztásához.
- A program a Shell névtér API felületeit és metódusait használhatja az elemek használatához.
- A program erőforrásfájl-alapú testreszabási modell helyett adatvezérelt testreszabási modellt használhat új vezérlők hozzáadásához a gyakori fájl párbeszédpanelekhez.
A IFileDialog-related interfacest akkor kell használnia, ha:
- testre kell szabnia a program általános fájl párbeszédpanelét a Windows 7-ben. Ez lehetővé teszi, hogy a program együttműködjön a kódtárakkal, és támogassa a párbeszédpanel testreszabását.
- azt szeretné, hogy a felhasználó több fájlt is kijelölhessen egy közös fájl párbeszédpanelen. Ez biztosítja, hogy a megfelelő elérési utakat kapja meg a kijelölt objektumhoz, mivel a tárak különböző mappákban tárolt tartalmakat tartalmazhatnak.
Az IFileDialog -hoz kapcsolódó felületekről a következő témakörben talál további információt:
- IFileDialog
- IFileOpenDialog
- IFileSaveDialog
- IFileDialogCustomize
- IFileDialogEvents
- IFileDialogControlEvents
A tár kiválasztásának engedélyezése a felhasználói felületről
Ha a program lehetővé teszi a felhasználó számára, hogy kijelöljön egy mappát, például importálás vagy exportálás céljából, akkor a Windows 7-ben is lehetővé kell tennie a felhasználó számára, hogy könyvtárat válasszon. Az IFileOpenDialog felület és SHBrowseForFolder függvény lehetővé teszi, hogy a felhasználó válasszon egy tárat, amikor a rendszer egy mappa kiválasztására kéri. Az IFileOpenDialog felület előnyben részesíti a SHBrowseForFolder függvényt, mert IFileOpenDialog támogatja a Windows 7 felhasználói felületét.
Ha engedélyezni szeretné a felhasználók számára, hogy mappákat válasszanak az IFileOpenDialog felület használatakor, hívja meg a SetOptionst a FOS_PICKFOLDERS jelölőkészlettel, és győződjön meg arról, hogy a FOS_FORCEFILESYSTEM jelölő tiszta.
FILEOPENDIALOGOPTIONS fileOptions;
hr = fileOpenDialogBox->GetOptions(&fileOptions);
fileOptions = fileOptions | FOS_PICKFOLDERS | ~FOS_FORCEFILESYSTEM;
hr = fileOpenDialogBox->SetOptions(fileOptions);
Ha engedélyezni szeretné a felhasználóknak, hogy mappákat válasszanak az SHBrowseForFolder függvény meghívásakor, az BROWSEINFO struktúrájának ulFlags tagjában állítsa be a BIF_USENEWUI jelölőt, és törölje a BIF_RETURNONLYFSDIRS jelzőt.
BROWSEINFO browseInfo;
browseInfo.ulFlags = BIF_USENEWUI | ~BIF_RETURNONLYFSDIRS;
// Set other member values
pidl = SHBrowseForFolder(&browseInfo);
Kódtár tartalmának elérése egy programban
A tár tartalmának eléréséhez a Windows Shell API-t kell használnia. A fájlrendszer API funkciói nem használhatók a kódtár tartalmának eléréséhez, mert a kódtárak nem fájlrendszerobjektumok. Ha a program a fájlrendszer API-ján alapuló egyéni fájlböngészőt használ, akkor nem fog tudni böngészni a tárakban, és nem fér hozzá a tár tartalmához.
Ez a szakasz azt ismerteti, hogyan érheti el a kódtár tartalmát, hogy a program frissítésének legjobb módja a kódtárak használata legyen.
Kódtár tartalmának elérése az IShellLibrary felülettel
A legegyszerűbb módja annak, hogy egy program elérje a könyvtár tartalmát, ha a Shell Library API-t vesz igénybe. Ha egy olyan programon dolgozik, amely a fájlrendszer-API-t használja, a Shell Library API vissza tudja adni a könyvtár fájlrendszer mappáit, ami minimálisra csökkenti a meglévő programkód módosításának szükségességét.
IShellLibrary *picturesLibrary;
hr = SHLoadLibraryFromKnownFolder(FOLDERID_PicturesLibrary,
STGM_READ,
IID_PPV_ARGS(&picturesLibrary));
// picturesLibrary now points to the user's picture library
IShellItemArray *pictureFolders;
hr = pslLibrary->GetFolders(LFF_FORCEFILESYSTEM, IID_PPV_ARGS(&pictureFolders));
// pictureFolders now contains an array of Shell items that
// represent the folders found in the user's pictures library
Kódtár tartalmának elérése a Shell API-kkal
Mivel a kódtár-objektumok a Shell programozási modell részét képezik, más Windows Shell API-kkal is használhatók. Használhatja például a program IShellItem és IShellFolder felületeit, valamint a kapcsolódó segédfüggvényeket, hogy ugyanúgy hozzáférjen a könyvtár tartalmához, mint amikor a mappák és mappatartalmak számbavétele történik a fájlrendszer API-jaival.
A Windows Shell API-k két enumerálási módot támogatnak a kódtár tartalmának eléréséhez:
Lista tallózása
A tallózási enumerálás az alapértelmezett enumerálási mód, és egy könyvtár mappa tartalmát sorolja fel. Törölje a SHCONTF_NAVIGATION_ENUM jelzőt a mód használatához.
Navigációs felsorolás
A navigációs számlálás a könyvtár mappákat sorolja fel. Állítsa be a SHCONTF_NAVIGATION_ENUM jelölőt erre a módra.
Ha a program egyéni fa vezérlőelemet használ a felhasználó mappáinak navigálásához, a navigációs enumerálási módban a mappák számbavétele egy könyvtár mappáinak listáját adja meg, amely összhangban van azzal, ahogyan a Windows Intéző a Windows 7-ben számba veszi a mappákat.
A funkciók programokban való használatára vonatkozó példákért tekintse meg a Windows SDK ShellStorage mintáját.
Felhasználói tartalom mentése tárban
A program a felhasználói tartalmakat mentheti egy tárba, valamint a tár egy mappájába. Hasonlóképpen, a felhasználó menthet egy tár egy adott mappájába, vagy egyszerűen mentheti a tárba.
Minden tár rendelkezik egy mappával, amely az alapértelmezett mentési helyként van kijelölve. Az alapértelmezett mentési hely a tár létrehozásakor lesz definiálva; a felhasználó azonban hozzárendelheti az alapértelmezett mentési helyet a tár bármely mappájába. Bár a felhasználónak nem kell alapértelmezett mentési helyet konfigurálnia, lehetősége van a módosításra. Ha a felhasználó törli az alapértelmezett mentési helyként beállított mappát, a tár automatikusan a tár következő mappáját állítja be alapértelmezett mentési helyként.
A felhasználói tartalmakat többféleképpen is mentheti egy tárba.
Shell API-
Ha a Shell programozási modelljét használja, és egy IShellItem, IStorage vagy IStream által képviselt Shell-elemet ment egy tárobjektumba, a Rendszerhéj-elem automatikusan a tár alapértelmezett mentési helyén lesz tárolva.
Fájlrendszer-API
Ha már rendelkezik olyan programmal, amely számos fájlrendszerbeli API-hívást használ, a tár alapértelmezett mentési helyeként definiált mappa elérési útját is lekérheti. A mappa elérési útja ezután átadható egy fájlrendszer API-nak.
A funkciók programokban való használatára vonatkozó példákért tekintse meg a Windows SDK ShellStorage mintáját.
Húzd és ejtsd műveletek támogatása egy könyvtárban
Ha a program támogatja a húzási műveleteket, ezeket frissíteni kell a megfelelő kódtár-interakció támogatása érdekében. Ha egy fájlt egy könyvtárba ejtenek, a beejtett fájlt az alapértelmezett mentési helyre kell menteni. Ha egy mappa egy könyvtárba kerül, a bedobott mappát új mappaként kell hozzáadni a könyvtárhoz. Ha egy fájl olyan meglévő mappába kerül, amely nem az alapértelmezett mentési hely, a fájlt hozzá kell adni a kijelölt mappához.
A programok húzási funkciójának kódtár-támogatásának hozzáadására vonatkozó példákért tekintse meg a ShellLibraryCommandLine-mintát a Windows SDK-ban.
A könyvtárral való szinkronban maradás
Ez a témakör azt ismerteti, hogy a program hogyan tudja megőrizni a tár tartalmának up-to-date nézetét.
Tömeges frissítés
Mivel a felhasználó interaktívan módosíthatja egy tár mappáit, ha a program nem fut, a programnak meghívnia kell SHResolveLibrary, amikor elkezdi felderíteni és tárolni a tár módosításait. A Shell API biztosítja a SHResolveLibrary függvényt, amely lehetővé teszi, hogy a program lekérje a tár aktuális tartalmát és a tárban található mappák aktuális helyét.
Vegye figyelembe, hogy SHResolveLibrary egy blokkoló függvény, amely hosszú időt vehet igénybe a visszatéréshez attól függően, hogy mi változott a kódtárban. Ezért nem szabad felhasználói felületi szálból meghívni.
Miután a program up-todátumot kapott, regisztrálhat a változásértesítésekre az aktuális nézet fenntartása érdekében.
Shell API-értesítés
A Windows Shell API biztosítja a SHChangeNotifyRegister függvényt, amely az elsődleges módja annak, hogy a nem szolgáltatási folyamatok értesüljenek a kódtár változásáról.
Ha a Windows Shell API-val szeretné észlelni a tár elemeinek változásait, hívja meg SHChangeNotifyRegister, hogy regisztrálja a programot a tármappában lévő elemek módosításainak értesítéseiért. Ez a függvény értesítést küld a programnak, ha bármilyen tárban vagy csak egy adott tárban változás történt. A kódtár módosításakor a rendszer azonnal értesítést küld.
Fájlrendszer API-értesítése
A fájlrendszer-értesítéseket a szolgáltatási folyamatokban kell használni.
A tár elemeinek a fájlrendszer API-val történő módosításának észleléséhez számba kell adni a tár mappáit, és meghívni FindFirstChangeNotification minden figyelendő mappához. A program értesítést kap, ha egy figyelt mappa megváltozik. A mappában módosított fájlok adott fájljának megkereséséhez hívja meg ReadDirectoryChangesW. A kódtár-leírásfájl módosításainak észleléséhez figyelje meg az azt tartalmazó mappát. A kódtár leírásfájlja a FOLDERID_Libraries mappában található. A kódtár leírásfájlja azonban nem nyitható meg és nem módosítható.
Kapcsolódó témakörök