Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пространство имен оболочки упорядочивает файловую систему и другие объекты, управляемые оболочкой, в одну структуру дерева иерархии. Концептуально это более широкая и более инклюзивная версия файловой системы.
- введение
-
определение объектов пространства имен
- идентификаторы элементов
- Списки идентификаторов элементов
- PIDLs
- распределение PIDL
Знакомство
Одной из основных обязанностей оболочки является управление и предоставление доступа к широкому спектру объектов, составляющих систему. Наиболее многочисленными и знакомыми этими объектами являются папки и файлы, которые находятся на дисках компьютера. Однако оболочка управляет рядом нефайловых систем и виртуальных объектов. Ниже приведены некоторые примеры:
- Сетевые принтеры
- Другие сетевые компьютеры
- Приложения панели управления
- Корзина
Некоторые виртуальные объекты вообще не включают физическое хранилище. Например, объект принтера содержит коллекцию ссылок на сетевые принтеры. Другие виртуальные объекты, такие как корзина, могут содержать данные, хранящиеся на диске, но должны обрабатываться не так, как обычные файлы. Например, виртуальный объект можно использовать для представления данных, хранящихся в базе данных. С точки зрения пространства имен различные элементы в базе данных могут отображаться в проводнике 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 похож на полный путь и однозначно идентифицирует объект в пространстве имен Оболочки.
Полные ПИН-адреса редко используются. Многие функции и методы ожидают относительнойPIDL. Корнем относительного PIDL является папка, а не рабочий стол. Как и относительные пути, ряд идентификаторов элементов, составляющих структуру, определяют путь в пространстве имен между двумя объектами. Хотя они не однозначно идентифицируют объект, они обычно меньше, чем полный PIDL и достаточно для многих целей.
Наиболее часто используемые относительные PIDLs, одноуровневые PIDLs, относятся к папке родителя объекта. Они содержат только идентификатор элемента объекта и завершающий NULL. Многоуровневые PIDL также используются во многих целях. Они содержат два или более идентификаторов элементов и обычно определяют путь от родительской папки к объекту через ряд из одной или нескольких вложенных папок. Обратите внимание, что одноуровневый PIDL по-прежнему может быть полным идентификатором PIDL. В частности, объекты рабочего стола являются дочерними элементами рабочего стола, поэтому их полные идентификаторы PIDL содержат только один идентификатор элемента.
Как обсуждалось в в разделе о получении идентификатора папки, API оболочки предоставляет ряд способов получения PIDL объекта. Получив его, вы обычно используете его для идентификации объекта при вызове других функций и методов API оболочки. В этом контексте внутреннее содержимое PIDL непрозрачно и не имеет значения. В целях этого обсуждения думайте о PID-файлах как маркерах, представляющих определенные объекты пространства имен, и сосредоточьтесь на том, как их использовать для распространенных задач.
Выделение PIDL-объектов
Несмотря на то, что PIDLs имеют некоторое сходство с путями, их использование требует немного иного подхода. Основное различие заключается в выделении и освобождении памяти для них.
Как и для строки, используемой для пути, память должна быть выделена для PIDL. Если приложение создает PIDL, оно должно выделить достаточно памяти для структуры ITEMIDLIST. В большинстве случаев, рассмотренных здесь, оболочка создает PIDL и обрабатывает выделение памяти. Независимо от того, что выделяет PIDL, приложение обычно отвечает за освобождение PIDL, когда оно больше не требуется.
Используйте функцию CoTaskMemAlloc для выделения PIDL и функции CoTaskMemFree, чтобы освободить ее.