Заглядываем под капот библиотек

Итак, теперь вы знаете, что такое библиотеки, для чего они предназначены и как их наличие помогает пользователям и разработчикам. Это третья по счету статья в серии, посвященной библиотекам. В предыдущей статье мы рассказали, что они из себя представляют и насколько важную роль играют в повседневной работе. В сегодняшней статье мы расскажем о низкоуровневой архитектуре библиотек.

Начнём с обзора предшественников библиотек Windows 7. Windows Vista обеспечивала новый способ хранения пользовательских данных и новые пространства имён в пользовательском профиле, известные как «Known Folders». Это был следующий, эволюционный, шаг от стандартных папок, основанных на списке постоянных специальных идентификаторов (CSIDL). Значения в списке обеспечивали независимый от конкретной системы способ идентификации специальных папок, часто используемых различными приложениями. В Windows Vista мы заменили эти значения системой «Known Folders», где постоянная KNOWNFOLDERID идентифицирует каждую папку.

Оба варианта, CSIDL и Known Folders, включают поддержку специальных типов пользовательского содержимого: Документы, Музыка, Изображения и Видео, – эти папки являются частью профиля каждого пользователя. Библиотеки Windows 7 расширяют Known Folders каждого пользователя, например, папку документов, до библиотеки документов. Если вы посмотрите на KNOWNFOLDERID в SDK бета-версии Windows 7, то увидите, что устанавливаемые по умолчанию библиотеки – это и есть Known Folders, что, безусловно, имеет смысл, поскольку мы хотим унифицировать способы программирования доступа к пользовательскому контенту. По определению, каждая библиотека содержит две «физических» папки:

· Личные папки пользователя, отсортированные по типу (документы, изображения и т.д.) представленные по умолчанию папками Known Folder, которые включены в состав библиотек и хранятся в определяемом по умолчанию месте.

· Папки общего доступа, отсортированные по типу

Для библиотек, создаваемых пользователем, этим местом хранения будет первая добавленная в библиотеку папка.

В каком-то смысле библиотека похожа на обычную папку. С пользовательской точки зрения библиотека выглядит и ведёт себя как папка. Но, в отличии от папки, библиотека собирает файлы, разбросанные по иным местам хранения, и представляет их в одном месте. Это небольшое, но очень важное отличие. Библиотеки не хранят пользовательские данные, они лишь наблюдают за папками с объектами и предоставляют пользователю доступ к ним, организуя их разными способами. Они также предоставляют пользователям и авторам программ доступ к списку папок и их содержимому. Например, вы пытаетесь сохранить текстовый документ из Notepad прямиком в библиотеку документов, но файл сохранён не будет. Что же произойдёт в таком случае? Текстовый документ будет сохранён в определённое по умолчанию место сохранения файлов для библиотеки документов, которым, опять же по умолчанию, является папка с документами, называющаяся «Мои Документы», и являющаяся элементом пользовательского профиля. Пользователь полностью контролирует это определённое по умолчанию место сохранения файлов так же, как и все остальные места, являющиеся частями библиотеки. Как показано на рисунке ниже, диалог управления библиотекой изображений (доступный прямо из пользовательского интерфейса Windows Explorer) содержит несколько папок на локальном жёстком диске моего ПК с одной из папок, определённых в качестве места хранения по умолчанию.

clip_image002

Рис. 1. Диалог управления библиотекой

Важно знать, что библиотека изображений не подменяет папку «Мои Изображения» в Windows Vista. Она включает в себя эту папку как одно из мест хранения в библиотеке изображений. Имейте ввиду, что система CSIDL и её API поддерживаются из соображений совместимости. Однако мы не рекомендуем использовать их при создании новых программ. Предпочтительно использовать систему Known Folders.

Библиотеки в Windows 7 представляют собой XML-файлы с расширением «.library-ms». Имя файла – это имя библиотеки. Например, библиотека документов представлена файлом Documents.library-ms. Описания библиотек сохраняются в папке %appdata% Roaming\Microsoft\Windows\Libraries (также известной как FOLDERID_Libraries). Вы можете использовать файлы для наблюдения за изменениями в библиотеках. Но об этом в следующих статьях.

Давайте углубимся в архитектуру библиотеки документов. Структура XML говорит сама за себя, но всё же необходимо пояснить некоторые элементы. Наверху располагается «заголовок», как мы его называем, с информацией:

 

 <libraryDescription xmlns="https://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>

Корневой XML-элемент – libraryDescription, содержащий дочерние элементы, определяющие библиотеку:

· <ownerSID> – элемент, определяющий идентификатор безопасности пользователя, создавшего библиотеку, чтобы изолировать библиотеку и защитить данные от несанкционированного доступа

· <isLibraryPinned> – булева переменная, определяющая, прикреплен ли ярлык библиотеки к левой панели Windows Explorer, но не к панели задач

· <version> – определяет версию содержимого библиотеки, отражающий число изменений файла определения библиотеки

· <templateInfo> – необязательный контейнерный элемент, позволяющий автору указывать тип папки (документы, изображения и т.д.) для контроля организации представлений в Windows Explorer

· <iconReference> определяет файл, из которого берутся изображения для ярлыков, используя стандартный стиль Windows Shell; например, <iconReference> C:\Windows\system32\imageres.dll,-65 </iconReference>. Эта иконка представляет библиотеку

Пользователь не может поменять иконку библиотеки по умолчанию с помощью Windows Explorer и не может ассоциировать иконку с определённой пользователем библиотекой. Это можно сделать программно с помощью API. Но об этом в одной из следующей статей.

Ключевая часть XML – список мест хранения, представленных через библиотеку:

 

 <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> – содержит одну или больше поисковых меток, прикреплённых к действительным местам хранения, включённым в библиотеку

· <searchConnectorDescription> содержит элемент <simpleLocation> описывающий место хранения, включённое в библиотеку

· <url> определяет URL места хранения и предназначен для облегчения интерпретации человеком, разработчиками использоваться не может, поскольку по большей части эта информация быстро устаревает

· <serialized> – это актуальное представление (Base64) места хранения, являющееся серийным объектом ShellLink

И еще одно замечание: программы ни в коем случае не должны открывать или изменять файлы описания библиотек. Вместо этого программам всегда следует использовать Shell-модель программирования или IShellLibrary API для использования и управления содержимым библиотек. Ну а в следующей статье мы рассмотрим Shell-модель программирования.