Поделиться через


Общие сведения о пространстве имен оболочки

Пространство имен оболочки упорядочивает файловую систему и другие объекты, управляемые оболочкой, в единую иерархию с древовидной структурой. По сути, это более крупная и более инклюзивная версия файловой системы.

Введение

Одной из основных обязанностей оболочки является управление различными объектами, составляющими систему, и предоставление доступа к ней. Наиболее многочисленными и знакомыми из этих объектов являются папки и файлы, которые находятся на дисках компьютера. Однако оболочка также управляет рядом нефайловой системы или виртуальных объектов. Некоторые примеры:

  • Сетевые принтеры
  • Другие сетевые компьютеры
  • приложения панель управления
  • Корзина

Некоторые виртуальные объекты вообще не используют физическое хранилище. Например, объект printer содержит коллекцию ссылок на сетевые принтеры. Другие виртуальные объекты, такие как корзина, могут содержать данные, хранящиеся на диске, но должны обрабатываться иначе, чем обычные файлы. Например, виртуальный объект можно использовать для представления данных, хранящихся в базе данных. С точки зрения пространства имен различные элементы в базе данных могут отображаться в windows Обозреватель в виде отдельных объектов, даже если все они хранятся в одном файле диска.

Виртуальные объекты могут находиться даже на удаленных компьютерах. Например, для облегчения перемещения файлы документов пользователя могут храниться на сервере. Чтобы предоставить пользователям доступ к файлам с нескольких настольных компьютеров, папка "Мои документы" на настольном компьютере, который они используют в данный момент, будет указывать на сервер, а не на жесткий диск настольного компьютера. Его путь будет включать сопоставленный сетевой диск или UNC-путь.

Как и файловая система, пространство имен включает два основных типа объектов: папки и файлы. Объекты папок — это узлы дерева; они представляют собой контейнеры для файловых объектов и других папок. Объекты file — это листья дерева; Это либо обычные файлы дисков, либо виртуальные объекты, такие как ссылки принтера. Папки, не входящие в файловую систему, иногда называют виртуальными папками.

Как и папки файловой системы, коллекция виртуальных папок обычно зависит от системы. Существует три класса виртуальных папок:

  • Стандартные виртуальные папки, такие как корзина, которые находятся во всех системах.
  • Необязательные виртуальные папки со стандартными именами и функциями, но могут присутствовать не во всех системах.
  • Нестандартные папки, установленные пользователем.

В отличие от папок файловой системы, пользователи не могут самостоятельно создавать новые виртуальные папки. Они могут устанавливать только те, которые были созданы сторонними разработчиками. Таким образом, число виртуальных папок обычно гораздо меньше, чем количество папок файловой системы. Обсуждение реализации виртуальных папок см. в разделе Расширения пространства имен.

Визуальное представление структуры пространства имен отображается на панели Обозреватель Обозреватель Windows. Например, на следующем снимке экрана 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 является произвольной; они иллюстрируют тот факт, что размер этого элемента может отличаться.

схематическая иллюстрация pidl

PiDLs

Для API оболочки объекты пространства имен обычно идентифицируются указателем на их структуру ITEMIDLIST или указателем на список идентификаторов элементов (PIDL). Для удобства термин PIDL обычно ссылается в этой документации на саму структуру, а не на указатель на нее.

PiDL, показанный на предыдущем рисунке, называется полным или абсолютным PIDL. Полный КОД PIDL начинается с рабочего стола и содержит идентификаторы элементов всех промежуточных папок в пути. Он заканчивается идентификатором элемента объекта, за которым следует завершающий двухбайтовой null. Полный PIDL похож на полный путь и однозначно идентифицирует объект в пространстве имен оболочки.

Полные ПИН-коды используются редко. Многие функции и методы ожидают относительный PIDL. Корнем относительного PIDL является папка, а не рабочий стол. Как и в случае с относительными путями, ряд идентификаторов элементов, составляющих структуру, определяет путь в пространстве имен между двумя объектами. Хотя они не однозначно идентифицируют объект, они обычно меньше, чем полный PIDL и достаточны для многих целей.

Наиболее часто используемые относительные PIDLs , одноуровневые, относятся к родительской папке объекта. Они содержат только идентификатор элемента объекта и завершающее значение NULL. Многоуровневые PIDL также используются для многих целей. Они содержат два или более идентификаторов элементов и обычно определяют путь от родительской папки к объекту через ряд из одной или нескольких вложенных папок. Обратите внимание, что одноуровневый PIDL по-прежнему может быть полным PIDL. В частности, объекты рабочего стола являются дочерними элементами рабочего стола, поэтому их полные ПИН-коды содержат только один идентификатор элемента.

Как описано в разделе Получение идентификатора папки, API оболочки предоставляет несколько способов получения PIDL объекта. Как правило, вы просто используете его для идентификации объекта при вызове других функций и методов API оболочки. В этом контексте внутреннее содержимое PIDL непрозрачно и не имеет значения. Для целей этого обсуждения думайте о PIDL как о маркерах, представляющих определенные объекты пространства имен, и сосредоточьтесь на том, как использовать их для общих задач.

Выделение ПИН-кодов

Хотя PIDL имеют некоторое сходство с путями, их использование требует несколько другого подхода. Основное различие заключается в выделении и освобождении памяти для них.

Как и в случае со строкой, используемой для пути, для PIDL необходимо выделить память. Если приложение создает PIDL, оно должно выделить достаточно памяти для структуры ITEMIDLIST . В большинстве рассмотренных здесь случаев оболочка создает PIDL и обрабатывает выделение памяти. Независимо от того, что выделяет PIDL, приложение обычно отвечает за освобождение PIDL, когда он больше не нужен.

Используйте функцию CoTaskMemAlloc для выделения PIDL и функцию CoTaskMemFree , чтобы освободить ее.