Wewnątrz Windows 7: Wprowadzenie do bibliotek Udostępnij na: Facebook

Jest to pierwszy artykuł z serii artykułów dotyczących Windows 7. Seria ta skupia się na nowych cechach użytkowych, które programiści mogą wykorzystać przy tworzeniu swoich aplikacji dla Windows 7. Ten artykuł, część pierwsza, skupia się na nowym pojęciu przechowywania danych w profilu użytkownika w Windows 7, zwanym bibliotekami. Należy teraz pobrać wersję testową Windows 7, aby móc maksymalnie skorzystać z tego artykułu.

Co znaczą biblioteki dla użytkowników Windows 7

Zanim zaczniemy zagłębiać się w interfejs Windows 7 Libraries API, musimy lepiej zrozumieć, dlaczego wprowadzono biblioteki w Windows 7 i jak pomagają one użytkownikom w zarządzaniu swoimi materiałami.Aby lepiej zrozumieć pojęcie bibliotek w Windows 7, musimy cofnąć się w czasie.Wcześniejsze wersje Windows, jak Windows Vista i Windows XP, zawierały zestawy folderów specjalnych do przechowywania materiałów użytkowników, np. Moje dokumenty.System Windows XP wykorzystywał listę CSIDL (Constant Special Item ID List) będącą listą wartości, która zapewnia unikalny, niezależny od systemu sposób identyfikowania folderów specjalnych wykorzystywanych często przez aplikacje, ale mogących mieć różne nazwy lub lokalizacje w danym systemie.

W epoce Windows Vista, lista CSIDL ewoluowała do nowego systemu przechowywania danych zwanego identyfikatorami znanych folderów (Known Folder IDs).W Windows Vista specjalne foldery CSIDL są określane przez zestaw wartości GUID.Trzeba zauważyć, że system CSIDL jest nadal obsługiwany zarówno w Windows Vista, jak i Windows 7 w celu zachowania kompatybilności wstecznej.Na liście identyfikatorów znanych folderów można znaleźć folder FOLDERID_Documents.Ten folder reprezentuje zarówno folder Moje dokumenty jako część profilu przechowywania danych użytkownika, jak i FOLDERID_Fonts, jako część specjalnych folderów systemowych.W Windows 7 lista identyfikatorów znanych folderów została rozszerzona o obsługę bibliotek Windows 7.Można tam znaleźć między innymi identyfikatory GUID takie jak FOLDERID_DocumentsLibrary, który reprezentuje bibliotekę Dokumenty.W Windows Vista te foldery specjalne były automatycznie indeksowane pozwalając użytkownikom wykonywać szybsze i efektywniejsze operacje wyszukiwania na swojej zawartości.Jednakże odkryliśmy, że wielu użytkowników przechowuje pliki w różnych miejscach na swoim komputerze, nie tylko w „specjalnych” folderach profilu użytkownika, ale również w różnych folderach takich, jak c:\Mój folder tymczasowy, d:\Urodziny2008\zdjęcia lub nawet na zdalnych nośnikach pamięci.Przechowywanie plików poza obszarem magazynu profilu użytkownika wpływa na indeksowanie, co utrudnia efektywne wyszukiwanie danych przez użytkowników.Okazuje się, że często szukamy określonego pliku, nad którym pracowaliśmy kilka dni temu, ponieważ zapomnieliśmy, gdzie go zapisaliśmy, a następnie odkrywamy, że funkcja wyszukiwania nie może go znaleźć, ponieważ plik ten nie był nigdy indeksowany.

W systemie Windows 7 pojęcie bibliotek stara się wyjść naprzeciw problemowi przechowywania treści przez użytkowników po całym komputerze pozwalając im mieć pełną kontrolę nad strukturą folderów swojej biblioteki dokumentów.Innymi słowy w Windows 7 użytkownicy mogą definiować, które foldery mają być zawarte w bibliotece Dokumenty.Właściwie jest to prawdą w odniesieniu do dowolnej biblioteki w Windows 7. Możemy powiedzieć, że biblioteki są definiowanymi przez użytkownika kolekcjami folderów, które są logicznymi reprezentacjami materiałów użytkownika.Dołączając foldery do bibliotek użytkownik informuje system Windows, gdzie znajdują się jego ważne dane.System będzie indeksował te foldery, umożliwiając szybsze wyszukiwanie i znacznie bogatsze możliwości organizowania widoków w Eksploratorze Windows w oparciu o właściwości i metadane pliku. Rysunek 1 wyświetla integrację kilku folderów w pojedynczy widok biblioteki i pokazuje bogate wyszukiwania i zestawienia w Eksploratorze Windows w systemie Windows 7.

Integracja kilku folderów w pojedynczy widok biblioteki

Rysunek 1: Integracja kilku folderów w pojedynczy widok biblioteki

Biblioteki stanowią integralną część powłoki systemu Windows.Ta integracja jest bardzo ważna, ponieważ umożliwia użytkownikom przeglądanie swoich plików w taki sam sposób, jakby to robili w folderze, co oznacza, że użytkownicy nie muszą się uczyć nowych nawyków.Kliknięcie biblioteki Dokumenty po prostu pokazuje wszystkie dokumenty użytkownika w jednym miejscu.Co więcej, ze względu na fakt, że biblioteki są zintegrowane z powłoką systemu Windows, użytkownicy mogą wykonywać operacje wyszukiwania i filtrować wyniki korzystając z właściwości i metadanych takich, jak data wykonania zdjęcia, gatunek piosenki i popularność elementu.Innymi słowy korzystając z bibliotek użytkownicy mogą cieszyć się magazynem plików, który jest zarówno elastyczny, jak i zindeksowany.

Aplikacje wykorzystujące biblioteki

Warto zauważyć, że podczas gdy większość aplikacji powinna bez problemu współdziałać z bibliotekami Windows 7, to istnieje możliwość pełniejszego wykorzystania środowiska bibliotek Windows 7 w celu zapewnienia bogatszego interfejsu użytkownika.Można się zastanawiać, co by się stało, gdyby aplikacja nie obsługiwała bibliotek.Wyobraźmy sobie aplikację, która jako część swojej funkcjonalności musi zapisać plik na dysku.Ta aplikacja przedstawia użytkownikowi opcję wyboru miejsca, w którym ma być zapisany plik.Użytkownik może wybrać bibliotekę Dokumenty jako lokalizację do zapisu, ponieważ tam zwykle sięga, gdy potrzebuje pracować nad jakimś dokumentem.

Jednakże, jeśli aplikacja nie rozpozna, że biblioteka Dokumenty nie jest zwykłym folderem, to aplikacja będzie próbowała zapisać plik bezpośrednio w bibliotece Dokumenty tak, jakby była ona po prostu folderem na dysku.To stanowi pewien problem, ponieważ jak już wiemy biblioteki nie są lokalizacjami w systemie plików i dlatego nie mogą być traktowane jako zwykłe foldery.Aplikacja musi mieć świadomość faktu, że ma do czynienia z bibliotekami.Na szczęście system Windows 7 zawiera uaktualnione interfejsy Shell API i Libraries API oraz uaktualnione standardowe plikowe okna dialogowe, co pozwala programistom poprawnie obsługiwać biblioteki.

Aplikacja wykorzystująca biblioteki powinna zawierać mechanizmy obsługujące sytuacje, w których użytkownicy próbują wybierać biblioteki tak jakby były folderami przy zapisywaniu plików lub ładowaniu zawartości biblioteki.Co więcej, większość aplikacji pozwala użytkownikom na interakcję z systemem plików jako częścią funkcjonalności aplikacji.Aplikacja powinna zapewniać użytkownikom te same znajome z systemu możliwości i interfejs użytkownika oferowane przez biblioteki Windows 7.Poprzez dołączanie folderów do biblioteki użytkownicy określają, gdzie są przechowywane ich ważne dane, informując nas, że jest to zawartość, na której im zależy.Aplikacje powinny promować te lokalizacje poprzez obsługę bibliotek.

Dla programistów istnieje kilka miejsc integracji z systemem Windows 7, które pomagają aplikacjom wykorzystywać biblioteki.Programiści powinni zapoznać się z następującymi trzema punktami integracji i wybrać odpowiednie do swoich potrzeb.

  1. Najbardziej podstawowym punktem integracji jest po prostu korzystanie ze standardowego plikowego okna dialogowego (CFD – Common File Dialog) do wybierania plików i folderów oraz zapisywanie bezpośrednio w bibliotece.
  2. Drugi punkt integracji oferuje aplikacjom możliwość zabłyśnięcia w systemie Windows 7 poprzez umożliwienie aplikacjom wybierania i konsumowania zawartości bibliotek.
  3. Ostatni punkt integracji zapewnia najbardziej zaawansowaną opcję integracji poprzez pełną obsługę modelu programowania bibliotek.

Korzystanie ze standardowych plikowych okien dialogowych

Dobra wiadomość jest taka, że biblioteki Windows 7 są pełnoprawnymi obywatelami w standardowych plikowych oknach dialogowych (CFD), co pozwala użytkownikom przeglądać i przeszukiwać biblioteki.Mogą oni nawet wybrać określoną bibliotekę jako lokalizację do zapisu pliku – to znaczy nie tylko jeden z folderów wewnątrz biblioteki, ale raczej samą bibliotekę!Ponieważ biblioteki Windows 7 opierają się na przestrzeni dyskowej, użytkownicy mogą zapisywać i kopiować pliki do dowolnego folderu zawartego w bibliotece, do którego mają uprawnienia.Każda biblioteka ma domyślny folder zapisu, gdzie trafiają pliki, gdy użytkownicy kopiują i zapisują pliki bezpośrednio w bibliotece.Domyślnie lokalizację tę będzie stanowił znany folder, który jest zawarty w standardowej bibliotece lub pierwszy folder dodany do niestandardowej biblioteki.

Ale (zawsze istnieje to zastrzeżenie!) wielce zalecane jest korzystanie z nowego interfejsu standardowych plikowych okien dialogowych (CFD), który został wprowadzony w systemie Windows Vista, a nie ze starszej wersji CFD.Bardzo ważne jest, aby zwrócić uwagę, że interfejsy API do korzystania ze starszych wersji CFD nie zostały zmienione od wprowadzenia Windows Vista i Windows XP z powodów związanych z zachowaniem kompatybilności dla dotychczasowych aplikacji.Jednakże starsza wersja CFD nie obsługuje bezpośrednio bibliotek ani pełni nowych możliwości oferowanych w Windows 7. Rysunek 2 pokazuje obok siebie stare i nowe standardowe plikowe okno dialogowe.

Stara i nowa wersja standardowego plikowego okna dialogowego

Stara i nowa wersja standardowego plikowego okna dialogowego

Rysunek 2: Stara i nowa wersja standardowego plikowego okna dialogowego

W starszych oknach CFD, nawet jeśli biblioteki są przedstawiane w prawym okienku nawigacyjnym, to wymagane jest dodatkowe kliknięcie w celu zapisu danych w jednym z zawartych w bibliotece folderów zamiast wybrania po prostu samej biblioteki.Użytkownicy nie mogą wyszukiwać bezpośrednio z poziomu standardowego plikowego okna dialogowego, nie mogą korzystać z programów obsługi bogatego podglądu plików, ani nie mogą zaznaczać wielu plików w różnych folderach, ponieważ starsze okna CFD nie obsługują zwracania wielu plików z różnych folderów.Dla odróżnienia scenariusz ten jest obsługiwany przez biblioteki Windows 7.

Ważne jest, aby korzystać z odpowiednich interfejsów API do wyświetlania poprawnej wersji okna CFD.Jeśli chodzi o wyświetlanie standardowego plikowego okna dialogowego przy użyciu .NET, programiści mogą skorzystać z przestrzeni nazw System.Windows.Forms.FileDialog lub Microsoft.Win32.FileDialog.Ponieważ ta druga wykorzystuje starszą wersję okien CFD, programiści .NET powinni zawsze korzystać z przestrzeni nazw WinForms w celu wyświetlania nowych okien CFD.Rysunek 3 przedstawia fragment kodu, który prosi użytkownika o wybranie lokalizacji do zapisania pliku wyświetlając standardowe okno dialogowe zapisu pliku i umożliwiając użytkownikowi wybranie folderów lub bibliotek.

Rysunek 3: Plik SaveFileDialog

System.Windows.Forms.SaveFileDialog _fd = new System.Windows.Forms.SaveFileDialog();

_fd.Title = "Please choose a location to save your file";

_fd.FileName = "[Get Folder…]";

_fd.Filter = "Library|no.files";

if (_fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

{

    string dir_path = System.IO.Path.GetDirectoryName(_fd.FileName);

    if (dir_path != null && dir_path.Length > 0)

    { 

        lblResult.Content = dir_path; 

    }

}

Programiści wykorzystujący kod niezarządzany powinni korzystać z nowej rodziny interfejsów API IFileDialog:IFileDialog, IFileOpenDialog, IFileSaveDialog, IFileDialogCustomize, IFileDialogEvents, IFileDialogControlEvents.Zastępują one starsze interfejsy API z wcześniejszych wersji Windows:GetOpenFileName, GetSaveFileName.

Rysunek 4 pokazuje, jak skorzystać z nowej rodziny interfejsów API IFileDialog w celu wyświetlenia użytkownikowi okna dialogowego do zapisu pliku w folderze / bibliotece. 

Rysunek 4: Interfejs API IFileDialog

IFileSaveDialog *pfod;

hr = CoCreateInstance(

CLSID_FileSaveDialog,

NULL,

CLSCTX_INPROC,

IID_PPV_ARGS(&pfod));

if (SUCCEEDED(hr))

{

  hr = pfod->SetOptions(FOS_PICKFOLDERS);

  if (SUCCEEDED(hr))

  {

  hr = pfod->Show(hWndParent);

           if (SUCCEEDED(hr))

           {

           hr = pfod->GetResult(ppsi);

           }

    }

    pfod->Release();

}

Interfejsy API powłoki są oparte na technologii COM.Przed użyciem dowolnego obiektu COM musimy zainicjować ten obiekt COM wywołując CoCreateInstance.Po zainicjowaniu zmiennej *pfod typu IFileSaveDialog ustawiamy opcje okna dialogowego na wybór folderów przekazując flagę FOS_PICKFOLDERS do IFileOpenDialog.SetOptions().Ten kod nakazuje oknu dialogowemu Otwórz umożliwienie użytkownikowi zaznaczania folderów zamiast plików i pozwala użytkownikowi wybrać bibliotekę jako lokalizację do zapisu.W przypadku wybrania biblioteki, okno CFD zwróci wtedy domyślną lokalizację foldera zapisu skojarzonego z wybraną biblioteką.

Rysunek 3 i Rysunek 4 są bardzo proste i nie wprowadzają żadnego nowego kodu.Jednakże ważne jest promowanie spójności wśród aplikacji działających pod kontrolą systemu Windows 7 i wspieranie bibliotek Windows 7.Okna CFD są zaprojektowane tak, aby zapewniać interfejs spójny z nowym Eksploratorem Windows, w tym obsługę bibliotek.Wszystkie usprawnienia wprowadzone w Eksploratorze Windows 7 zostały przeniesione do standardowych plikowych okien dialogowych.W większości przypadków jest to idealny sposób, aby użytkownicy przeglądali i wykorzystywali biblioteki wewnątrz aplikacji.

Zaznaczanie i wykorzystywanie bibliotek jak folderów

Wyobraźmy sobie przypadek aplikacji do pokazów slajdów, która prezentuje zdjęcia użytkownikowi.Przy wykorzystaniu bibliotek użytkownik informuje system, że swoje ważne zdjęcia przechowuje w bibliotece Obrazy.Aplikacja może po prostu wskazać bezpośrednio na bibliotekę Obrazy i wyświetlić cały zbiór zdjęć użytkownikowi.Co więcej, z punktu widzenia programisty korzystanie z systemu bibliotek może wyeliminować na przykład konieczność utrzymywania oddzielnego pliku konfiguracyjnego lub bazy danych zdjęć, ponieważ programiści mogą oprzeć się na systemie bibliotek.Zanim zagłębimy się w interfejsy programistyczne API bibliotek, musimy zrozumieć kilka pojęć dotyczących modelu programowania powłoki (Shell Programming Model).

Model programowania powłoki

Element powłoki (IShellItem), często nazywany po prostu elementem, jest podstawą interfejsu użytkownika powłoki i jej modelu programistycznego.Elementy są indywidualnymi, samodzielnymi źródłami zawartości.Na przykład całkiem sporo metod interfejsu używanych do sterowania standardowymi plikowymi oknami dialogowymi wykorzystuje elementy powłoki przy odwoływaniu się do folderów zamiast ścieżek systemu plików.Jest to ważne, ponieważ okno CFD może przekazywać informacje zarówno dotyczące folderów systemu plików, jak i innych folderów wirtualnych, które można znaleźć w powłoce, takich jak folder Panel sterowania lub Komputer.

Innymi ważnymi interfejsami COM powłoki są:

  • Interfejs IShellLink reprezentuje łącze, zwykle do pliku, folderu lub programu wykonywalnego
  • Interfejs IShellFolder reprezentuje obiekty folderów powłoki z przestrzeni nazw powłoki.Korzystając z IShellFolder możemy przechodzić przez zawartość folderu, pobierać wyświetlaną nazwę elementu w folderze, przetwarzać wyświetlaną nazwę w odniesieniu do folderu i uzyskiwać listę identyfikatorów elementów.

Windows 7 wprowadza nowy interfejs API powłoki zwany IShellLibrary, który możemy odpytywać z IShellItem w celu wykorzystania i obsługi bibliotek w systemie Windows 7.

Teraz gdy zdefiniowaliśmy różne składniki modelu programowania powłoki, możemy zobaczyć, jak biblioteki pasują do tego modelu.Ponieważ biblioteki nie są lokalizacjami w systemie plików, nie możemy korzystać z interfejsów API specyficznych dla systemu plików, jak FindFirstFile.Zamiast tego mamy dwie główne opcje służące do korzystania z zawartości biblioteki.

Korzystanie z modelu programowania powłoki

Możemy korzystać z interfejsów IShellItem i IShellFolder oraz wielu funkcji pomocniczych w celu wyliczania zawartości bibliotek, tak jakby były zwykłymi folderami.Oznacza to, że aplikacje mogą korzystać z zawartości biblioteki bez korzystania z nowych interfejsów API dla bibliotek i z bardzo małymi zmianami istniejącego kodu.

Rysunek 5 pokazuje, jak skorzystać z interfejsu IShellFolder w celu wyszczególnienia całej zawartości biblioteki Obrazy.

Rysunek 5: Interfejs IShellFolder

IShellItem *psi;

HRESULT hr =  SHGetKnownFolderItem(FOLDERID_PicturesLibrary, KF_FLAG_CREATE, NULL, IID_PPV_ARGS(&psi));

if(SUCCEEDED(hr))

{

    IShellFolder *psf;

    hr = psi->BindToHandler(NULL, BHID_SFObject | , IID_PPV_ARGS(&psf));

    if(SUCCEEDED(hr))

         {

               IEnumIDList *penumIDList;

               psf->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS , IID_PPV_ARGS(&penumIDList));

               //skorzystaj z penumIDList do wyszczególnienia zawartości folderu

          }

}

Widać tutaj, że poprzez wykorzystanie funkcji pomocniczej SHGetKnownFolderItem możemy pobrać właściwą lokalizację biblioteki przekazując FOLDERID_PicturesLibrary.Jest to identyfikator GUID reprezentujący znany folder, którym w naszym przypadku jest biblioteka Obrazy.Udane wywołanie wypełni interfejs IShellItem *psi prawidłowymi informacjami dotyczącymi biblioteki przedstawionej jako element powłoki.Pozostała część kodu to standardowe programowanie powłoki, gdzie korzystamy z BindToHandler w celu powiązania wcześniej uzyskanego elementu powłoki z folderem powłoki (przez rzutowanie).Następnie wyliczamy różne elementy w folderze powłoki, którymi w przypadku biblioteki mogą być albo pliki, albo foldery.SHGetKnownFolderItem jest funkcją pomocniczą powłoki i jest częścią większej grupy funkcji pomocniczych, które można znaleźć w pliku nagłówkowym shlobj.h w zestawie Windows 7 RC SDK.Należy zwrócić uwagę na flagi SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, które przekazujemy.Informuje to folder powłoki, że chcemy uzyskać wszystkie pliki i foldery w bibliotece.Moglibyśmy przekazać SHCONTF_NAVIGATION_ENUM, aby uzyskać lokalizacje biblioteki, zamiast zawartości biblioteki.

Korzystanie z nowego interfejsu API IShellLibrary

Możemy uzyskać taką samą funkcjonalność, jak pokazana na Rysunku 5 wykorzystując nowy interfejs API IShellLibrary z systemu Windows 7, jak pokazano na Rysunku 6.

Rysunek 6: Interfejs API IShellLibrary

IShellLibrary *pslLibrary;

HRESULT hr = SHLoadLibraryFromKnownFolder(FOLDERID_PicturesLibrary, STGM_READ, IID_PPV_ARGS(&pslLibrary));

if(SUCCEEDED(hr))

{

       IShellItemArray *psiaFolders;

       hr = pslLibrary->GetFolders(LFF_STORAGEITEMS, IID_PPV_ARGS(&psiaFolders));

       IEnumShellItems *penumShellItems;

       psiaFolders->EnumItems(&penumShellItems);

       //skorzystaj z penumShellItem do wyliczenia elementów w bibliotece

}

Tutaj można zobaczyć, że korzystamy z innej funkcji pomocniczej SHLoadLibraryFromKnownFolder w celu utworzenia obiektu IShellLibrary.Z tego obiektu możemy wywołać metodę GetFolders, aby zwrócić IShellitemArray.Ta zwrócona wartość jest używana później do uzyskania obiektu służącego do przechodzenia przez całą zawartość biblioteki.

W ostatnim przykładzie skorzystaliśmy z funkcji pomocniczej SHLoadLibraryFromKnowFolder.Jak to było wspomniane wcześniej, tę funkcję pomocniczą i inne związane z bibliotekami Windows 7 można znaleźć w pliku nagłówkowym shlobj.h z zestawu Windows 7 RC SDK.Oto lista ważnych funkcji pomocniczych związanych z bibliotekami:

  • SHAddFolderPathToLibrary (dodaje folder do biblioteki)
  • SHCreateLibrary (tworzy obiekt IShellLibrary)
  • SHLoadLibraryFromItem (tworzy i ładuje obiekt IShellLibrary z określonego pliku definicyjnego biblioteki)
  • SHLoadLibraryFromKnownFolder (tworzy i ładuje obiekt IShellLibrary z określonego identyfikatora KNOWNFOLDERID)
  • SHLoadLibraryFromParsingName (tworzy i ładuje obiekt IShellLibrary dla określonej ścieżki)
  • SHRemoveFolderPathFromLibrary (usuwa folder z biblioteki)
  • SHResolveFolderPathInLibrary (próbuje ustalić lokalizację docelową foldera biblioteki, który został przeniesiony lub którego nazwa została zmieniona)
  • SHSaveLibraryInFolderPath (zapisuje obiekt IShellLibrary na dysku)

Przejrzyjmy następujący kod (Rysunek 7), który wykorzystuje kilka z tych funkcji pomocniczych do utworzenia nowej biblioteki, skojarzenia foldera z tą biblioteką i „zapisania” biblioteki w folderze Biblioteki.

Rysunek 7: Interfejs IShellLibrary korzystający z funkcji pomocniczej SHCreateLibrary

HRESULT hr = SHCreateLibrary(IID_PPV_ARGS(&pIShelLibrary));

if (SUCCEEDED(hr))

{

      IShellItem *pIShellItem;

      SHAddFolderPathToLibrary(pIShelLibrary, L"C:\\Users\\Public\\Documents");

      hr = pIShelLibrary->SaveInKnownFolder(FOLDERID_Libraries, L"My New Library", LSF_MAKEUNIQUENAME,

            &pIShellItem);

      pIShellItem->Release();

      pIShelLibrary->Release();

}

Tutaj możemy zobaczyć, że tworzymy nowy obiekt IShellLibrary korzystając z funkcji pomocniczej SHCreateLibrary.Następnie dodajemy publiczny folder Dokumenty do obiektu biblioteki.Następnie zapisujemy nową bibliotekę w folderze Biblioteki razem z pozostałymi bibliotekami i nadajemy mu nazwę My New Library.

Na Rysunku 7 korzystaliśmy z metody SaveInKnownFolder interfejsu IShellLibrary w celu zapisania nowej biblioteki, którą właśnie utworzyliśmy.Większość metod interfejsu IShellLibrary nie wymaga wyjaśnienia.Przyjrzyjmy się jednak kilku, które wymagają naszej uwagi:

  • Metoda Commit zatwierdza zmiany w bibliotece do istniejącego pliku bibliotecznego.Oznacza to, że gdy tylko programowo zmieniamy bibliotekę, to musimy wywołać metodę Commit w celu zapisania tych zmian.
  • Metoda SetIcon wykorzystuje nazwę biblioteki DLL z zasobami i indeks ikony w celu ustawienia ikony biblioteki.
  • SetFolderType przyjmuje identyfikator GUID szablonów typów znanych folderów jako parametr wejściowy.Ten identyfikator GUID definiuje typ biblioteki, który może być jednym z następujących:Ogólny, Obrazy, Muzyka, Wideo i Dokumenty.Ustawienie szablonu typu folderu zmienia widok biblioteki w Eksploratorze Windows i umożliwia opcje wyszukiwania i widoków przestawnych, które są specyficzne dla danego typu biblioteki.

Biblioteki pod maską

Jak pokazano na Rysunku 7, kod ten tworzy nowy plik biblioteki w folderze Biblioteki.Biblioteka w systemie Windows 7 jest przechowywana jako definiujący ją plik XML, który ma rozszerzenie .library-ms.Nazwa pliku jest faktyczną nazwą biblioteki.Na przykład biblioteka Dokumenty jest reprezentowana przez plik XML o nazwie Dokumenty.library-ms.Opisy bibliotek są zapisywane na dysku w folderze %appdata%\Microsoft\Windows\Libraries (znanym również jako FOLDERID_Libraries).

Zagłębmy się w schemat pliku definicyjnego biblioteki Dokumenty.Struktura XML raczej nie wymaga wyjaśnień, ale omówmy kilka jej elementów.Jak pokazano na Rysunku 8, u góry pliku możemy znaleźć informację nagłówkową dotyczącą biblioteki:

Rysunek 8: Schemat pliku definicyjnego biblioteki Dokumenty

<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/  library">

  <name>@shell32.dll,-34575</name>

  <ownerSID>S-1-5-21-2127521184-1604012920-1887927527-4897363</ownerSID>

  <version>4</version>

  <isLibraryPinned>true</isLibraryPinned>

  <iconReference>imageres.dll,-1002</iconReference>

  <templateInfo>

    <folderType>{7D49D726-3C21-4F05-99AA-FDC2C9474656}</folderType>

  </templateInfo>

Głównym elementem XML jest libraryDescription, który zawiera następujące elementy podrzędne definiujące bibliotekę:

  • <ownerSID> definiuje identyfikator zabezpieczeń użytkownika, który utworzył tę bibliotekę w celu izolowania bibliotek od siebie i ochrony danych użytkownika przed innymi użytkownikami.
  • <isLibraryPinned> jest elementem typu Boolean, który definiuje, czy biblioteka jest przyczepiona do lewego okienka nawigacyjnego w Eksploratorze Windows, a NIE do paska zadań.
  • <version> definiuje wersję zawartości tej biblioteki, co określa, ile razy plik definicyjny danej biblioteki był zmieniany.
  • <templateInfo> jest opcjonalnym elementem-pojemnikiem, który pozwala autorowi określić typ foldera (Dokumenty, Obrazy, Wideo) w celu kontroli nad układami widoków w Eksploratorze Windows.
  • <iconReference> definiuje zasób z ikoną korzystając ze standardowego stylu dla zasobów dla powłoki Windows. Na przykład: <iconReference> C:\Windows\system32\imageres.dll,-65 </iconReference>.

Ta ikona przedstawia bibliotekę w Eksploratorze Windows.

Użytkownicy nie mogą zmieniać domyślnej ikony bibliotek poprzez Eksploratora Windows, ani nie mogą przypisać ikony do nowej, niestandardowej biblioteki zdefiniowanej przez użytkownika.Jednakże można to zrobić programowo korzystając z interfejsu API, co omówimy w przyszłych częściach tej serii.

Kluczową częścią pliku XML jest lista lokalizacji reprezentowanych przez bibliotekę, jak pokazano w następującym kodzie:

<searchConnectorDescriptionList>

    <searchConnectorDescription publisher="Microsoft" product="Windows">

      <description>@shell32.dll,-34577</description>

      <isDefaultSaveLocation>true</isDefaultSaveLocation>

      <isSupported>true</isSupported>

      <simpleLocation>

        <url>knownfolder:{FDD39AD0-238F-46AF-ADB4-6C85480369C7}</url>

      <serialized>MBAAAE…. </serialized>

      </simpleLocation>

    </searchConnectorDescription>
  • <searchConnectorDescriptionList> zawiera jeden lub kilka łączników wyszukiwania, które powiązane są z fizycznymi lokalizacjami zawartymi w bibliotece.
  • <searchConnectorDescription> zawiera element simpleLocation, który opisuje pojedynczą lokalizację zawartą w bibliotece.
  • <url> definiuje URL dla tej lokalizacji.Służy tylko do odczytywania przez ludzi, nie może być wykorzystywane przez programistów, ponieważ prawdopodobnie może być nieaktualne.
  • <serialized> jest faktyczną reprezentacją lokalizacji w bibliotece, która jest zserializowanym obiektem ShellLink.

Ostatnia uwaga:Aplikacje nigdy nie powinny próbować uzyskiwać dostępu do lub edytować plików opisowych bibliotek.Zamiast tego aplikacje powinny zawsze korzystać z modelu programowania powłoki lub interfejsu API IShellLibrary do przetwarzania i manipulowania zawartością biblioteki.

Obsługa pełnego modelu bibliotecznego

Użytkownik może dodawać, usuwać i zmieniać kolejność lokalizacji, jak również zmieniać domyślną lokalizację zapisu poprzez interfejs użytkownika Zarządzanie bibliotekami.Pokazano to na Rysunku 9, który przedstawia okno dostępne bezpośrednio z Eksploratora Windows.

Rysunek 9 Interfejs użytkownika zarządzania bibliotekami

Ponadto lokalizacje biblioteki można modyfikować poprzez interfejs IShellLibrary.Wszelkie zmiany w strukturze biblioteki są odzwierciedlane w pliku definicyjnym biblioteki i są zachowywane bezpośrednio w powiązanym z nią pliku .library-ms.Można uzyskiwać informacje o takich zmianach poprzez monitorowanie wszelkich zmian w pliku .library-ms.Załóżmy, że nasza aplikacja zależy od zawartości biblioteki albo nasza aplikacja aktualnie wyświetla zawartość danej biblioteki.Chcielibyśmy być powiadamiani, gdy zawartość biblioteki się zmieni.Aplikacje, które chcą być powiadamiane o zmianach w piku definicyjnym biblioteki, mogą to robić poprzez wykorzystanie funkcji pomocniczej powłoki SHChangeNotifyRegister lub korzystając z zarządzanej klasy FileSystemWatcher dostępnej w przestrzeni nazw System.IO.Korzystanie z tych interfejsów wykracza poza zakres tego artykułu, ponieważ nie są to nowe interfejsy API i są one dobrze udokumentowane.

Inną opcją do rozważenia jest przypadek, gdy nasza aplikacja musi zarządzać folderami za użytkowników, jak na przykład dodawaniem nowego foldera ze zdjęciami do repozytorium zdjęć.Jeśli korzystamy z biblioteki Obrazy, możemy skorzystać z okna dialogowego zarządzania biblioteką w naszej aplikacji, aby wyświetlić to samo okno dialogowe, które system Windows 7 oferuje użytkownikom do zarządzania swoimi bibliotekami.W ten sposób utrzymujemy spójny wygląd i zachowanie aplikacji, które użytkownicy docenią.Jeśli wybierzemy skorzystanie z interfejsu okna dialogowego zarządzania biblioteką, to zmiany biblioteki będą dokonywane tak, jakbyśmy modyfikowali zawartość biblioteki bezpośrednio w Eksploratorze Windows.To okno dialogowe nie zwróci żadnych informacji do naszej aplikacji.W przypadku, gdy wyświetlamy zawartość danej biblioteki, będziemy musieli zarejestrować powiadomienia, aby otrzymywać uaktualnienia, jak to zostało wyjaśnione powyżej.

Podsumowanie

W tym artykule wprowadzone zostało pojęcie i model programistyczny bibliotek w systemie Windows 7. Przyjrzeliśmy się ważnej roli, jaką odgrywają biblioteki jako część interfejsu użytkownika Windows 7.Następnie zagłębiliśmy się w biblioteki wyjaśniając, czym są biblioteki i badając ich architekturę.Następnie zobaczyliśmy różne możliwości, które stoją przed programistami, aby mogli wykorzystać biblioteki w swoich aplikacjach.Na koniec dokonaliśmy krótkiego przeglądu różnych dostępnych modeli i interfejsów programistycznych.

 

Yochay Kiriaty pracuje jako Technical Evangelist w firmie Microsoft skupiając się na Windows 7. Ma ponad dekadę doświadczenia w tworzeniu oprogramowania.Przygotowywał i prowadził akademickie kursy informatyczne i jest aktywnym współautorem The Windows Blog.

Alon Fliess pracuje jako główny przedstawiciel zarządu ds. technicznych w Sela Group.Firma Sela może pochwalić się 18-letnimi osiągnięciami w szkoleniach informatycznych i jest uważana za izraelskiego lidera w szkoleniu personelu IT.Alon dobrze rozumie technologie komputerowe i uzyskał stopień inżyniera elektryka i informatyka w Technion – Izraelskim Instytucie Technicznym.Alon programuje i uczy od 22 lat i jest ekspertem w wielu technologiach Microsoft, zwłaszcza dotyczących wnętrza systemu Windows, programowania Win32 w C++, oraz .Net w C# lub C++/CLI.