Введение в пространство имен оболочки
Пространство имен оболочки упорядочивает файловую систему и другие объекты, управляемые оболочкой, в одну структуру дерева иерархии. Концептуально это более широкая и более инклюзивная версия файловой системы.
Знакомство
Одной из основных обязанностей оболочки является управление и предоставление доступа к широкому спектру объектов, составляющих систему. Наиболее многочисленными и знакомыми этими объектами являются папки и файлы, которые находятся на дисках компьютера. Однако оболочка также управляет рядом объектов, не относящихся к файловой системе, или виртуальных объектов. Ниже приведены некоторые примеры:
- Сетевые принтеры
- Другие сетевые компьютеры
- Приложения панели управления
- Корзина
Некоторые виртуальные объекты вообще не включают физическое хранилище. Например, объект принтера содержит коллекцию ссылок на сетевые принтеры. Другие виртуальные объекты, такие как корзина, могут содержать данные, хранящиеся на диске, но должны обрабатываться не так, как обычные файлы. Например, виртуальный объект можно использовать для представления данных, хранящихся в базе данных. С точки зрения пространства имен различные элементы в базе данных могут отображаться в проводнике Windows в виде отдельных объектов, даже если они хранятся в одном файле диска.
Виртуальные объекты могут находиться даже на удаленных компьютерах. Например, для упрощения перемещения файлы документов пользователя могут храниться на сервере. Чтобы предоставить пользователям доступ к файлам с нескольких настольных компьютеров, папка "Мои документы" на компьютере, которым они в настоящее время пользуются, будет указывать на сервер, а не на жесткий диск настольного компьютера. Путь будет содержать сопоставленный сетевой диск или имя пути UNC.
Как и файловая система, пространство имен включает два основных типа объекта: папки и файлы. Объекты папок — это узлы дерева; они являются контейнерами для файловых объектов и других папок. Объекты файлов — это листья дерева; они являются обычными файлами дисков или виртуальными объектами, такими как ссылки принтера. Папки, которые не входят в файловую систему, иногда называются виртуальными папками.
Как и папки файловой системы, коллекция виртуальных папок обычно зависит от системы к системе. Существует три класса виртуальных папок:
- Стандартные виртуальные папки, такие как Корзина, которые имеются во всех системах.
- Необязательные виртуальные папки с стандартными именами и функциями, но могут не присутствовать во всех системах.
- Нестандартные папки, установленные пользователем.
В отличие от папок файловой системы пользователи не могут создавать новые виртуальные папки самостоятельно. Они могут устанавливать только те, которые создаются разработчиками, не являющихся корпорацией Майкрософт. Таким образом, число виртуальных папок обычно гораздо меньше, чем количество папок файловой системы. Сведения о реализации виртуальных папок см. в разделе расширения пространства имен.
Вы можете увидеть визуальное представление структуры пространства имен в панели проводника Windows Explorer. Например, на следующем снимке экрана в Проводнике Windows показано относительно простое пространство имен.
Конечным корнем иерархии пространства имен является рабочий стол. Сразу под корнем находятся несколько виртуальных папок, таких как "Мой компьютер" и корзина.
Файловые системы различных дисковых накопителей являются подмножествами более крупной иерархии пространства имен. Корневыми директориями этих файловых систем являются подкаталоги папки "Мой компьютер". Мой компьютер также содержит корни любых сопоставленных сетевых дисков. Другие узлы в дереве, такие как "Мои документы", являются виртуальными папками.
Определение объектов пространства имен
Прежде чем использовать объект пространства имен, необходимо сначала определить его. Объект в файловой системе может иметь такое имя, как MyFile.htm. Так как в системе могут быть другие файлы с таким именем, однозначно идентифицируя файл или папку, требуется полный путь, например "C:\MyDocs\MyFile.htm". Этот путь в основном является упорядоченным списком всех папок в пути от корневого каталога файловой системы, C:\, заканчивая файлом.
В контексте пространства имен пути по-прежнему очень полезны для идентификации объектов, расположенных в файловой системе части пространства имен. Однако их нельзя использовать для виртуальных объектов. Вместо этого оболочка предоставляет альтернативные средства идентификации, которые можно использовать с любым объектом пространства имен.
Идентификаторы элементов
В папке каждый объект имеет идентификатор элемента , который является функциональным эквивалентом имени файла или папки. Идентификатор элемента фактически представляет собой структуру SHITEMID:
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
Элемент abID является идентификатором объекта. Длина abID не определена, а его значение определяется папкой, содержащей объект. Так как нет стандартного определения того, как значения abID назначаются папками, они имеют смысл только для связанного объекта папки. Приложения должны просто рассматривать их как маркер, который идентифицирует объект в определенной папке. Поскольку длина abID может изменяться, элемент cb хранит размер структуры SHITEMID в байтах.
Так как идентификаторы элементов не полезны для отображения, папка, содержащая объект, обычно присваивает ему отображаемое имя. Это имя, используемое проводником Windows при отображении содержимого папки. Дополнительные сведения о обработке отображаемых имен см. в разделе Получение сведений из папки.
Списки идентификаторов элементов
Идентификатор элемента редко используется самостоятельно. Как правило, он является частью списка идентификаторов элемента, который служит той же цели, что и путь к файловой системе. Однако вместо символьной строки, используемой для путей, список идентификаторов элемента является структурой ITEMIDLIST. Эта структура является упорядоченной последовательностью одного или нескольких идентификаторов элементов, завершаемых двумя байтами NULL. Каждый идентификатор элемента в списке идентификаторов элемента соответствует объекту пространства имен. Их порядок определяет путь в пространстве имен, как путь к файловой системе.
На следующем рисунке представлено схематическое изображение структуры ITEMIDLIST, соответствующей C:\MyDocs\MyFile.htm. Название каждого идентификатора элемента показано над ним. Различные ширины членов abID — произвольны; они иллюстрируют тот факт, что размер этого члена может различаться.
PiDLs
Для API оболочки объекты пространства имен обычно определяются указателем на структуру ITEMIDLIST или указателем на список идентификаторов элементов (PIDL). Для удобства термин PIDL обычно будет ссылаться в этой документации на саму структуру, а не указатель на нее.
PIDL, показанный на предыдущем рисунке, называется полнойили абсолютной, PIDL. Полный PIDL начинается с рабочего стола и содержит идентификаторы элементов всех промежуточных папок в пути. Он заканчивается идентификатором элемента объекта, за которым следует завершающий двухбайтовый код: символ NULL, представленный как и. Полный PIDL аналогичен полностью квалифицированному пути и однозначно идентифицирует объект в пространстве имен оболочки Shell.
Полные ПИН-адреса используются редко. Многие функции и методы ожидают относительнойPIDL. Корнем относительного PIDL является папка, а не рабочий стол. Как и относительные пути, ряд идентификаторов элементов, составляющих структуру, определяют путь в пространстве имен между двумя объектами. Хотя они не однозначно идентифицируют объект, они обычно меньше, чем полный PIDL и достаточно для многих целей.
Наиболее часто используемые относительные PIDL, одноуровневые PIDL, являются относительными к родительской папке объекта. Они содержат только идентификатор элемента объекта и завершающий NULL. Многоуровневые PIDL также используются для многих целей. Они содержат два или более идентификаторов элементов и обычно определяют путь от родительской папки к объекту через ряд из одной или нескольких вложенных папок. Обратите внимание, что одноуровневый PIDL по-прежнему может быть полностью квалифицированным PIDL. В частности, объекты рабочего стола являются дочерними элементами рабочего стола, поэтому их полные идентификаторы PID содержат только один идентификатор элемента.
Как обсуждалось в о получении идентификатора папки, Shell API предоставляет несколько способов получения PIDL объекта. Получив его, вы обычно используете его для идентификации объекта при вызове других функций и методов API оболочки. В этом контексте внутреннее содержимое PIDL непрозрачно и не имеет значения. В целях этого обсуждения думайте о PID-файлах как маркерах, представляющих определенные объекты пространства имен, и сосредоточьтесь на том, как их использовать для распространенных задач.
Выделение PIDLs
Несмотря на то, что ПИН-адреса имеют некоторое сходство с путями, их использование требует несколько другого подхода. Основное различие заключается в выделении и освобождении памяти для них.
Как и строка, используемая для пути, память должна быть выделена для PIDL. Если приложение создает PIDL, оно должно выделить достаточно памяти для структуры ITEMIDLIST. В большинстве случаев, рассмотренных здесь, оболочка создает PIDL и обрабатывает выделение памяти. Независимо от того, что выделяет PIDL, приложение обычно отвечает за освобождение PIDL, когда оно больше не требуется.
Используйте функцию CoTaskMemAlloc для выделения PIDL и функции CoTaskMemFree, чтобы освободить ее.