Megosztás a következőn keresztül:


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:

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.

általános fájl párbeszédpanel képernyőképe, amely a könyvtárakat mutatja

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:

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ó.

A könyvtárakról

IShellLibrary

Shell-hivatkozások

Ismert mappák

Könyvtár leírási séma

IID_PPV_ARGS